gpt4 book ai didi

javascript - 处理 promise 在 promise.all() 中单独解决

转载 作者:搜寻专家 更新时间:2023-11-01 04:22:37 24 4
gpt4 key购买 nike

有很多关于如何在使用 catch 使用 promise.all() 时处理错误的信息,但我想要实现的是每次都处理此 promise.all() 中的一个 promise 解决了。我尝试这样做的原因是因为我试图在控制台中设置自定义进度条,并且每次解决 promise 时我都需要调用 tick 方法。

this.getNewSources = function () {
var bar = new ProgressBar(':bar', {total: this.getSourceMap().size});
var timer = setInterval(function () {
bar.tick();
if (bar.complete) {
console.log('\ncomplete\n');
clearInterval(timer);
}
}, 100);

let promiseArr = [];
for (let x of this.getSourceMap().values()) {
promiseArr.push(this.requestArticles(x.getName(), x.getCat(), x.getKey()));
}

return Promise.all(promiseArr).then(() => {
console.log("Articles loaded this round: " + this.articles.size);
console.log('all sources updated');
this.loadedArticles = true;
console.log(this.articleCount);
console.log(this.articles.size);
}).catch(e => {
console.log(e);
});
};

我正在尝试找出一种方法,以便在每个单独的 promise 解析时能够调用 bar.tick() 方法。

最佳答案

(回答我自己的问题。)

我通过添加一个 then 处理程序来处理它,我从 requestArticles 获得 promise (我将它们插入 promiseArr 数组)。我必须确保将处理程序接收到的值传递给处理程序,以便它传播到 Promise.all,请参阅 *** 行:

 this.getNewSources = function () {
var bar = new ProgressBar(':bar', {total: this.getSourceMap().size});
var timer = setInterval(function () {
if (bar.complete) {
console.log('\ncomplete\n');
clearInterval(timer);
}
}, 100);

function updateProgressBar() {
bar.tick()
}

let promiseArr = [];
for (let x of this.getSourceMap().values()) {
promiseArr.push(this.requestArticles(x.getName(), x.getCat(), x.getKey())
.then(value => { // ***
updateProgressBar(); // ***
return value; // ***
}) // ***
);
}

return Promise.all(promiseArr).then(() => {
console.log("Articles loaded this round: " + this.articles.size);
console.log('all sources updated');
this.loadedArticles = true;
console.log(this.articleCount);
console.log(this.articles.size);
}).catch(e => {
console.log(e);
});
};

这样,我的处理程序会在 promise 单独完成时被调用,并且由于我正在返回我收到的值,所以通过调用 then 创建的 promise 将使用该值解析,Promise.all 会看到。拒绝将跳过该处理程序并直接转到由 Promise.all 连接的处理程序。

The ascii progress library on npm

控制台输出结果:

console loading bar


(感谢 T.J. Crowder 他的初步解释,这让我意识到我可以在插入阵列的地方做到这一点。他说他更喜欢删除那个答案,让我发布这个。)

关于javascript - 处理 promise 在 promise.all() 中单独解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43573624/

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