gpt4 book ai didi

node.js - Promise.all().then 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:29 24 4
gpt4 key购买 nike

我使用promise.all来限制并发访问数,但是promise.all().then()不起作用,flag总是false,为什么!!

function getPage(singeUrl) {
return new Promise((resolve,reject)=>{
superagent.get(singeUrl)
.set({'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'})
.charset('utf8')
.end(function (err, sres) {
if (err) throw err;
utils.singleRequest(sres,db)
});
resolve('resolve=='+singeUrl)
})
}
let flag = true;
pages.forEach((item) => {
if(flag){
flag = false;
let promises = item.map(function (url) {
return getPage(url);
});
Promise.all(promises).then(res => {
flag = true;
})
}
})

最佳答案

编辑:

问题在于,由于您正在循环访问 Promise 的多维数组,并且条件 if (flag) 依赖于 flag 为 true 来执行 pages.forEach() 中的任何代码,因此循环会在第一次迭代后停止执行任何代码。这是因为 Promise.All() 是一个异步操作。当从 pages[0] 创建的 Promise 已解析(同时将 flag 设置为 true)时,迭代已经完成其第一个循环,但 flag 仍设置为 false

您可以通过展平多维 Promise 数组来解决此问题,这样 Promise.all() 将立即等待所有 Promise,而不是迭代它们。

我对您的代码进行了一些更改来演示这一点:

let pages = [];
pages.push(['one', 'two']);
pages.push(['three', 'four']);
pages.push(['five', 'six']);

let getPage = function(singeUrl) {
return new Promise((resolve, reject)=>{
resolve('resolve=='+singeUrl)
if(!singleUrl) reject('No input');
});
}

let flag = true;

pages.forEach((item) => {
if(flag){
flag = false;
let promises = item.map(function (url) {

// You will notice in the output at the bottom, that
// only the array pages[0] have been executed by Promise.all()

console.log('url: ', url);

return getPage(url);
});

Promise.all(promises).then((res) => {

// The log statements below are executed last

console.log('flag1 in promise: ', flag);

flag = true;

console.log('flag2 in promise: ', flag);
});
}
});

// This statement executes before flag
// is set to true
console.log('final flag: ', flag);

输出:

url:  one
url: two
final flag: false
flag1 in promise: false
flag2 in promise: true

关于node.js - Promise.all().then 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139213/

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