str*_*rai 7 javascript loops nested promise
我对承诺不熟悉并坚持下面的练习.
我有一个值数组,我想在每个值上执行异步调用.在回调中,我想对第一次调用的结果执行另一个调用.
基本上,我的挫败感如下:执行顺序应为'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));
}
Run Code Online (Sandbox Code Playgroud)
可能有一个简单的解决方案,但我坚持下去.
你不需要延迟,这是你承诺连锁以来你所拥有的延迟反模式.
此外,.then
如果您希望它等待解析,您必须从处理程序返回一个promise .
你可以简单地使用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
}
Run Code Online (Sandbox Code Playgroud)
小提琴.
注意:绑定只是固定函数调用的值.在这种情况下,由于第一个参数(this
值)为空,它的行为就像function(fn,arg){ return function(arg){ return fn(arg); }}
是,它将函数调用转换为"部分应用程序" - 有关详细信息,请参阅MDN文档.