gpt4 book ai didi

javascript - 在解析到下一个 then 之前减少所有 JS Promise

转载 作者:行者123 更新时间:2023-11-28 15:10:17 24 4
gpt4 key购买 nike

我似乎找不到解决这个问题的正确方法。我有一个带有一堆 thenables 的 promise ,并且在一个解析器中,我想暂停并在数组上执行一系列工作(使用 promise ),并且我不希望在这一系列 promise 完成之前真正解决这个问题完全的。这个例子似乎让我非常接近,但我认为我可能创建了一个反模式。

http://taoofcode.net/promise-anti-patterns/

// async_series.js
// example of using reduce and promises and closure to create async results in series

var q = require('Q');
var results = [1, 2, 3, 4, 5];

function workCollection(arr) {

return arr.reduce(function(promise, item, index) {

return promise.then(function(result) {

return (function(i, r, idx){
setTimeout(function(){
console.log('item', i, 'result', r, 'index', idx);
}, 1000 * idx);
return true
})(item, result, index);

});

}, q().then(function(){return true}));

}

q()
.then(function(){
console.log('start');
})
.then(function(){
workCollection(results)
})
.then(function(){
console.log('done');
})
.catch(function(err){
console.log(err);
});

有点工作,但输出是:

start
done
item 1 result true index 0
item 2 result true index 1
item 3 result true index 2
item 4 result true index 3
item 5 result true index 4

与此相反(预期):

start
item 1 result true index 0
item 2 result true index 1
item 3 result true index 2
item 4 result true index 3
item 5 result true index 4
done

非常感谢您的建议。请在投票之前发表评论。

最佳答案

有很多事情:

  • 如前所述,您需要从 then 回调中返回 `` 的(promise)结果,否则链不会等待它
  • q().then(function(){return true}) 应该简单地是 q(true)
  • IIFE 没用。如果您需要任何内容​​的闭包范围,reduce 回调已经提供了它。
  • 您不能返回 true 并期望任何东西等待 setTimeout。您需要 promisify它(将其包装在 new Q.Promise(…) 中),或者只使用 Q.delay .

总而言之,您的代码应如下所示:

var q = require('Q');

function workCollection(arr) {
return arr.reduce(function(promise, item, index) {
return promise.then(function(result) {
return Q.delay(result, 1000);
}).then(function(result) {
console.log('item', item, 'result', result, 'index', index);
return true;
});
}, q(true));
}

q().then(function(){
console.log('start');
return [1, 2, 3, 4, 5];
}).then(workCollection).then(function(result) {
console.log('done', result);
}, function(err){
console.error(err);
});

关于javascript - 在解析到下一个 then 之前减少所有 JS Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36756526/

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