Questions tagged «promise»

承诺是延迟计算的一种策略,适用于多种并发样式:用于本地计算的线程和事件循环并发,以及同步和异步远程消息传递。一个promise表示异步操作的最终结果。处理承诺的主要方式是通过注册从承诺的最终值或失败原因到新承诺的转换的方法。

7
处理承诺链中的多个渔获
我对诺言仍然还很陌生,目前正在使用蓝鸟,但是在我不确定如何最好地处理它的情况下。 因此,举例来说,我在Express应用程序中有一个Promise链,如下所示: repository.Query(getAccountByIdQuery) .catch(function(error){ res.status(404).send({ error: "No account found with this Id" }); }) .then(convertDocumentToModel) .then(verifyOldPassword) .catch(function(error) { res.status(406).send({ OldPassword: error }); }) .then(changePassword) .then(function(){ res.status(200).send(); }) .catch(function(error){ console.log(error); res.status(500).send({ error: "Unable to change password" }); }); 所以我的行为是: 通过ID获取帐户 如果此时存在拒绝,请炸毁并返回错误 如果没有错误,则将文档转换为模型 使用数据库文档验证密码 如果密码不匹配,则炸开并返回其他错误 如果没有错误,请更改密码 然后返回成功 如果还有其他问题,请返回500 因此,当前的捕获量似乎并没有停止链接,这是有道理的,所以我想知道是否存在一种方法可以根据错误以某种方式强制链停止在某个点,或者是否有更好的方法构造这种形式以获得某种形式的分支行为,例如if X do Y …

3
如何将参数传递给Promise函数
这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。 someModule.someFunction.then(username, password,function(uid) { /*stuff */ } 功能类似于 var someFunction = new Promise(username, password, function(resolve, reject) { /*stuff using username, password*/ if ( /* everything turned out fine */ ) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });

5
如何从类似于Angular中的http one的静态数据创建Observable?
我正在使用此方法的服务: export class TestModelService { public testModel: TestModel; constructor( @Inject(Http) public http: Http) { } public fetchModel(uuid: string = undefined): Observable<string> { if(!uuid) { //return Observable of JSON.stringify(new TestModel()); } else { return this.http.get("http://localhost:8080/myapp/api/model/" + uuid) .map(res => res.text()); } } } 在组件的构造函数中,我这样订阅: export class MyComponent { testModel: TestModel; testModelService: …

4
Node JS Promise.all和forEach
我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。 我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。 对于n级嵌套,该模式应该是可重复的。 我需要使用promise.all或其他类似的技术来确定何时解析封闭例程。 并非每个元素都必然涉及进行异步调用。因此,在嵌套promise.all中,我不能仅基于索引对我的JSON数组元素进行分配。不过,我确实需要在嵌套的forEach中使用诸如promise.all之类的内容,以确保在解析封闭例程之前已进行了所有属性分配。 我正在使用bluebird promise lib,但这不是必需的 这是一些部分代码- var jsonItems = []; items.forEach(function(item){ var jsonItem = {}; jsonItem.name = item.name; item.getThings().then(function(things){ // or Promise.all(allItemGetThingCalls, function(things){ things.forEach(function(thing, index){ jsonItems[index].thingName = thing.name; if(thing.type === 'file'){ thing.getFile().then(function(file){ //or promise.all? jsonItems[index].filesize = file.getSize();

4
然后从诺言中返回
我有这样的JavaScript代码: function justTesting() { promise.then(function(output) { return output + 1; }); } var test = justTesting(); 对于var测试,我总是有一个未定义的值。我认为这是因为承诺尚未解决..有一种方法可以从承诺中返回价值吗?

13
正确编写承诺循环的方式。
如何正确构造一个循环,以确保以下的promise调用和链接的logger.log(res)通过迭代同步运行?(蓝鸟) db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise 我尝试了以下方法(来自http://blog.victorquinn.com/javascript-promise-while-loop的方法) var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; process.nextTick(loop); return resolver.promise; }); var count = 0; promiseWhile(function() { return …

5
在承诺链上使用setTimeout
在这里,我试图绕过promises。在第一个请求时,我获取了一组链接。在下一个请求时,我获取了第一个链接的内容。但是我想在返回下一个promise对象之前进行延迟。所以我使用setTimeout就可以了,但是它给了我下面的JSON错误(without setTimeout() it works just fine) SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外字符 我想知道为什么会失败? let globalObj={}; function getLinks(url){ return new Promise(function(resolve,reject){ let http = new XMLHttpRequest(); http.onreadystatechange = function(){ if(http.readyState == 4){ if(http.status == 200){ resolve(http.response); }else{ reject(new Error()); } } } http.open("GET",url,true); http.send(); }); } getLinks('links.txt').then(function(links){ let all_links = (JSON.parse(links)); globalObj=all_links; return getLinks(globalObj["one"]+".txt"); }).then(function(topic){ writeToBody(topic); …
115 javascript  json  promise 

4
为什么.json()返回诺言?
我最近一直在搞弄fetch()api,发现有些奇怪的地方。 let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => { return { data: response.json(), status: response.status } }) .then(post => document.write(post.data)); ; post.data返回一个Promise对象。 http://jsbin.com/wofulo/2/edit?js,输出 但是,如果将其写为: let url = "http://jsonplaceholder.typicode.com/posts/6"; let iterator = fetch(url); iterator .then(response => response.json()) .then(post => document.write(post.title)); ; post这是Object您可以访问标题属性的标准。 http://jsbin.com/wofulo/edit?js,输出 所以我的问题是:为什么response.json要在对象文字中返回一个promise,但是如果刚返回则返回一个值?

6
在AngularJS中将成功/错误/最终/捕获与承诺一起使用
我$http在AngularJs中使用,我不确定如何使用返回的Promise和处理错误。 我有此代码: $http .get(url) .success(function(data) { // Handle data }) .error(function(data, status) { // Handle HTTP error }) .finally(function() { // Execute logic independent of success/error }) .catch(function(error) { // Catch and handle exceptions from success/error/finally functions }); 这是一个好方法吗,还是有一个更简单的方法?

7
$ .when.apply($,someArray)有什么作用?
我正在阅读有关递延和承诺的文章,并不断遇到$.when.apply($, someArray)。我不清楚这到底是做什么的,正在寻找一种解释,说明哪一行可以正常工作(而不是整个代码段)。这里是一些上下文: var data = [1,2,3,4]; // the ids coming back from serviceA var processItemsDeferred = []; for(var i = 0; i < data.length; i++){ processItemsDeferred.push(processItem(data[i])); } $.when.apply($, processItemsDeferred).then(everythingDone); function processItem(data) { var dfd = $.Deferred(); console.log('called processItem'); //in the real world, this would probably make an AJAX call. setTimeout(function() …

16
取消香草ECMAScript 6 Promise链
是否有清除.thenJavaScript Promise实例的方法? 我已经在QUnit之上编写了一个JavaScript测试框架。该框架通过在.NET中运行每个测试来同步运行测试Promise。(很抱歉,此代码块的长度。我已尽我所能对其进行了评论,因此它不那么乏味。) /* Promise extension -- used for easily making an async step with a timeout without the Promise knowing anything about the function it's waiting on */ $$.extend(Promise, { asyncTimeout: function (timeToLive, errorMessage) { var error = new Error(errorMessage || "Operation timed out."); var res, // resolve() rej, …

4
如何在恢复功能之前等待JavaScript Promise解决?
我正在做一些单元测试。测试框架将页面加载到iFrame中,然后对该页面运行声明。在每次测试开始之前,我创建一个Promise,将iFrame的onload事件设置为call resolve(),设置iFrame的事件src,并返回promise。 因此,我可以调用loadUrl(url).then(myFunc),它将在执行任何myFunc操作之前等待页面加载。 我在测试中的所有地方都使用了这种模式(不仅用于加载URL),主要是为了允许对DOM进行更改(例如,单击按钮,然后等待div隐藏和显示)。 这种设计的缺点是,我不断编写带有几行代码的匿名函数。此外,尽管有变通方法(QUnit assert.async()),但定义诺言的测试函数在诺言运行之前就已完成。 我想知道是否有任何方法可以从a获取值Promise或等待(阻止/睡眠)直到其解析,类似于.NET的IAsyncResult.WaitHandle.WaitOne()。我知道JavaScript是单线程的,但是我希望这并不意味着函数不能产生结果。 本质上,是否有一种方法可以使以下人员按正确的顺序吐出结果? function kickOff() { return new Promise(function(resolve, reject) { $("#output").append("start"); setTimeout(function() { resolve(); }, 1000); }).then(function() { $("#output").append(" middle"); return " end"; }); }; function getResultFrom(promise) { // todo return " end"; } var promise = kickOff(); var result = getResultFrom(promise); $("#output").append(result); <script …

5
等待所有诺言解决
因此,我遇到了多个未知长度的promise链的情况。我希望在处理完所有链条后执行一些操作。那有可能吗?这是一个例子: app.controller('MainCtrl', function($scope, $q, $timeout) { var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); var all = $q.all([one.promise, two.promise, three.promise]); all.then(allSuccess); function success(data) { console.log(data); return data + "Chained"; } function allSuccess(){ console.log("ALL PROMISES RESOLVED") } one.promise.then(success).then(success); two.promise.then(success); three.promise.then(success).then(success).then(success); $timeout(function () { one.resolve("one done"); }, Math.random() …

3
AngularJS $ q.all
我已经在angularjs中实现了$ q.all,但是我无法使代码正常工作。这是我的代码: UploadService.uploadQuestion = function(questions){ var promises = []; for(var i = 0 ; i < questions.length ; i++){ var deffered = $q.defer(); var question = questions[i]; $http({ url : 'upload/question', method: 'POST', data : question }). success(function(data){ deffered.resolve(data); }). error(function(error){ deffered.reject(); }); promises.push(deffered.promise); } return $q.all(promises); } 这是我的控制器,它调用服务: uploadService.uploadQuestion(questions).then(function(datas){ …
106 angularjs  promise  q 

2
在此之前和之后放置渔获物
我很难理解将.catchBEFORE和AFTER放在嵌套诺言中的区别。 选择1: test1Async(10).then((res) => { return test2Async(22) .then((res) => { return test3Async(100); }).catch((err) => { throw "ERROR AFTER THEN"; }); }).then((res) => { console.log(res); }).catch((err) => { console.log(err); }); 选择2: test1Async(10).then((res) => { return test2Async(22) .catch((err) => { throw "ERROR BEFORE THEN"; }) .then((res) => { return test3Async(100); }); }).then((res) …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.