gpt4 book ai didi

node.js - 循环和嵌套 Promise

转载 作者:搜寻专家 更新时间:2023-10-31 23:15:17 24 4
gpt4 key购买 nike

我正在使用 Request-Promisecheerio抓取一些网站数据,基本上我正在努力实现以下目标:

  1. 创建一个空数组
  2. 登录
  3. 从一个页面获取一些信息并将对象插入数组
  4. 从另一个页面获取一些信息并将对象插入数组
  5. 对于数组中的每个 now 对象,我需要:
    • 转到存储在该对象中的 URL {link: "some url", items: []}
    • 循环遍历在该链接中找到的所有项目,并将其推送到迭代对象中的项目数组,如下所示:{link: "some url", items: [{item},{item}]} .
  6. 访问完成的 orderArray,它应该会输出如下内容:
{link: "some url", items: [{item},{item}]},
{link: "some url", items: [{item},{item}]},
{link: "some url", items: [{item},{item}]}

第 6 步 是我遇到问题的地方,如果不按照下面的代码将 promise 嵌套在 for 循环中,我不知道如何做到这一点,然后开始变得令人讨厌。我可以在这里指出正确的方向吗?

这是我当前的代码:

    let orderArray = [];

rp.post(login)

.then(function(res1){

// Login & Set Cookies
cookieJar = res1.headers['set-cookie'];

return rp(getOpenOrders);

})

.then(function($){

// Get Some Info from getOpenOrders

orderArray.push({info});

return rp(getShippedOrders);

})

.then(function($){

// Get Some Info from getShippedOrders

orderArray.push({info});

return orderArray;

})

.then(function($){

// Loop through each object in the orderArray
for (i = 0,; i < orderArray.length; i++){

rp(orderArray[I].link)

.then(function($){

//Get length of items on page
let itemsOnPage = $('tbody tr').length;

//Get some more details for each object
for (j = 0,; j < items.length; j++) {
let moreinfo = {…};
orderArray.items.push(moreinfo);
}

}
}

return orderArray;

})

.then(function($){

// Log finished Array
console.log(orderArray);

})

.catch(function(err){
console.log(err);
})

};

最佳答案

最简单和最干净的方法是使用async/await。但是该代码不会并行运行(除非我们等待 Promise.all)

.then(async() => {

// Loop through each object in the orderArray
for(let i = 0; i < orderArray.length; i++) {

// Some may argue no await inside loop...
// We wait for rp to resolve, it looks like
// synchronous code so it's easy to understand
const $ = await rp(orderArray[i].link);

let items = $('tbody tr');

for(const item of items) {
let moreinfo = {};
orderArray[i].items.push(moreinfo);
}

}

return orderArray;
})

您还可以使用 Promise.all并行发送所有请求并在所有请求完成时处理结果。

.then(() => {

// Loop through each object in the orderArray

const requests = [];

for(const order of orderArray) {
// Push each promise
requests.push(
rp(order.link)
);
}

// This will resolve when every request finishes
// If one fails, it will reject, going to `.catch`
return Promise.all(requests);
})
.then(results => {

// Results is an array containing each individual request result.

results.forEach(($, i) => {

//Get length of items on page
let items = $('tbody tr');

//Get some more details for each object
for(const item of items) {
let moreinfo = {};
orderArray[i].items.push(moreinfo);
}

})

return orderArray;

});

我假设 rp 解析了一个 cheerio 对象,如果没有,请告诉我。

我无法测试它,因为我没有你的完整代码,但它应该可以工作。

关于node.js - 循环和嵌套 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49641349/

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