我对承诺不熟悉并坚持下面的练习。
我有一个值数组,我想在每个值上执行异步调用。 在回调中,我想对第一次调用的结果执行另一个调用。
基本上,我的挫折感如下: 执行顺序应该是' 1x2x3x'但订单是' 123xxx'
换句话说,当第一个promise的sub / nested promise尚未完成时,循环已经进入下一次迭代..
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));
}
可能有一个简单的解决方案,但我坚持下去。
答案 0 :(得分:5)
你不需要延期,那是你承诺连锁以来的deferred anti pattern。
此外,如果您希望等待它解决,您必须从.then
处理程序返回一个承诺。
你可以简单地使用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
}
注意:绑定只是固定函数调用的值。在这种情况下,由于第一个参数(this
值)为空,它的作用类似于function(fn,arg){ return function(arg){ return fn(arg); }}
,即它将函数调用转换为&#34;部分应用程序&#34; - 有关详细信息,请参阅 the MDN docs。