gpt4 book ai didi

javascript - 在循环中链接嵌套的 promise

转载 作者:数据小太阳 更新时间:2023-10-29 04:44:13 25 4
gpt4 key购买 nike

我对 promises 有点陌生,并且坚持以下练习。

我有一组值,我想对每个值执行一个异步调用。在回调中,我想对第一次调用的结果执行另一个调用。

基本上,我的挫败感在于:执行顺序应该是'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));
}

可能有一个简单的解决方案,但我坚持不懈。

最佳答案

你不需要 deferred,那是 deferred anti pattern自 promises 链以来,您就在那里。

此外,如果您希望它等待它解决,您必须从 .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
}

fiddle .

注意:绑定(bind)只是固定函数调用的值。在这种情况下,由于第一个参数(this 值)为 null,它的行为类似于 function(fn,arg){ return function(arg){ return fn(arg); }} 即,它将函数调用转换为“部分应用程序”——有关更多信息,请参见 the MDN docs .

关于javascript - 在循环中链接嵌套的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com