我对诺言很陌生,并且坚持进行以下练习。
我有一个值数组,我想对每个值执行一个异步调用。在回调中,我想对第一个调用的结果执行另一个调用。
基本上,我的沮丧之处在于:执行顺序应为“ 1x2x3x”,但顺序应为“ 123xxx”
换句话说,当第一个promise的子/嵌套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));
}
可能有一个简单的解决方案,但我坚持下去。
您不需要递延,这就是自promises链以来您所拥有的递延反模式。
另外,.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
值)为null,因此它的行为是function(fn,arg){ return function(arg){ return fn(arg); }}
这样,它将一个函数调用转换为“部分应用程序”-有关更多信息,请参见MDN文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句