gpt4 book ai didi

javascript - 同步处理嵌套数组

转载 作者:行者123 更新时间:2023-12-01 00:15:53 25 4
gpt4 key购买 nike

我正在重构一些抓取某些网页的代码(消除“回调 hell ”),并且希望每个请求之间有三秒的延迟。这是请求函数:

const getHTML = function(page, i) {
return new Promise(function(resolve, reject) {
setTimeout(function () {
api.makeAPIGetRequest(page).then((html) => {
resolve(html);
}).catch((err) => {
reject(err);
})
}, i * 3000);
});
}

我正在遍历一个对象数组,然后遍历一个数组:

let p = [
{
location: 'England',
pages: [1, 3, 5]
},
{
location: 'Scotland',
pages: [2, 4, 6]
}
];

问题是输出是随机的(由于延迟):

Page 1 - Loaded
Page 2 - Loaded
Page 5 - Loaded
Page 4 - Loaded
Page 3 - Loaded
Page 6 - Loaded

应该是:

Page 1 - Loaded
Page 3 - Loaded
Page 5 - Loaded
Page 2 - Loaded
Page 4 - Loaded
Page 6 - Loaded

这是我的代码:

p.map(async (data) => {
await crawlLocationPages(data);
})

function crawlLocationPages(data) {

return Promise.all(
data.pages.map(async (page, i) => {
await getHTML(page, i).then((html) => { // <-- waits 3 seconds
console.log('Page ' + page + ' - Loaded' );
});

})
).then(() => {

})

};

我宁愿保持对象和数组模型不变。

感谢任何帮助。

最佳答案

await.map.forEach 中不起作用,但它在 for 循环中起作用。当然,它必须位于 async 函数内。

const run = async () => {
for(let data of p){
await crawlLocationPages(data);
}
}

const crawlLocationPages = async data => {
for(let page of data.pages){
const html = await getHTML(page);
console.log('Page ' + page + ' - Loaded - HTML = ', html );
await pause();
}
}

const pause = () => new Promise( (resolve, reject) => setTimeout(resolve, 3000) );

run()

关于javascript - 同步处理嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59770775/

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