Javascript 在循环中链接嵌套的承诺
我对承诺有点陌生,并且坚持下面的练习 我有一个值数组,我想对每个值执行一个异步调用。 在回调中,我想对第一个调用的结果执行另一个调用 基本上,我的挫折感是: 执行顺序应为“1x2x3x”,但执行顺序为“123xxx” 换句话说,当第一个承诺的子/嵌套承诺尚未完成时,循环已经进入下一个迭代Javascript 在循环中链接嵌套的承诺,javascript,loops,nested,promise,Javascript,Loops,Nested,Promise,我对承诺有点陌生,并且坚持下面的练习 我有一个值数组,我想对每个值执行一个异步调用。 在回调中,我想对第一个调用的结果执行另一个调用 基本上,我的挫折感是: 执行顺序应为“1x2x3x”,但执行顺序为“123xxx” 换句话说,当第一个承诺的子/嵌套承诺尚未完成时,循环已经进入下一个迭代 var values = ["1", "2", "3"]; function do(val) { var deferred = Q.defer(); asyncCall(val) .then(
var values = ["1", "2", "3"];
function do(val) {
var deferred = Q.defer();
asyncCall(val)
.then( function( response ) {
console.log(val);
asyncCall(response)
.then( function ( response ) {
console.log('x');
deferred.resolve(true)
});
});
return deferred.promise;
}
var result = do(values[0]);
values.forEach( function(f) {
result = result.then(do(f));
}
可能有一个简单的解决方案,但我一直坚持下去。你不需要延迟,这是你的承诺链 此外,您还必须从
处理程序返回承诺。如果希望它等待解决,则必须返回处理程序
您可以简单地使用for循环:
function do(val) {
var q = Q();
for(var i = 0; i < val; i++){
q = q.then(asyncCall.bind(null,i))
.then(console.log.bind(console))
.then(console.log.bind(console,"x"));
}
return q; // in case you want to chain
}
函数do(val){
var q=q();
对于(变量i=0;i
注意:Bind只是固定函数调用的值。在这种情况下,由于第一个参数(this
值)为空,它的作用类似于函数(fn,arg){return function(arg){return fn(arg);}}}
也就是说,它将函数调用转换为“部分应用程序”-有关更多信息,请参阅。谢谢您的回答。但我不完全明白。我已经删除了延迟模式,并按照如下方式重构了代码:函数检索(值){return asyncCall(值)。然后(函数响应){console.log(响应);return response.asyncCall2();})。然后(函数响应){console.log(响应);});}我可以在第一个“then”中省略返回,但是asyncCall2的承诺不会传递给第二个。@strai您可以在jsfiddle.net上创建一个fiddle来说明这个问题吗?这很难理解