我在努力学习使用承诺。
在这种情况下,我想做一个网络刮刀。我在这段代码中使用了request-promise
。
实际上刮刀工作正常。我不明白如何使用then()
中的返回值。我也在谷歌上搜索过,但没有运气,仍然被卡住。这是我的密码。
let categories = scrapper.getCategories(promoUrl);
categories.then(function (val) {
let promoPerCategory = [];
for (let i = 0, len = val.length; i < len; i++) {
let json = {
category: val[i].category,
url: val[i].url,
promo: []
}
scrapper.getPromoPerCategories(val[i].url)
.then(function (allPromo) {
for (let j = 0, lenResult = allPromo.length; j < lenResult; j++) {
json.promo.push({
imageUrl: allPromo[j].imageUrl,
merchantName: allPromo[j].merchantName,
promoTitle: allPromo[j].promoTitle,
validUntil: allPromo[j].validUntil,
promoUrl: allPromo[j].promoUrl
});
console.log(json.promo[j]);
}
})
promoPerCategory.push(json);
}
result.send({ "promoPerCategory": promoPerCategory });
})
then()
内部函数工作正常,我使用getPromoPerCategories
打印值。但问题是我想把array from
console.log(json.promo[j])
放入arrayjson.promo[j]
中,这样我就可以使用promoPerCategory
返回它。你能帮我做正确的事吗?任何帮助都将不胜感激。
结果现在是这样
{"promoPerCategory": [{"category":"Fashion","url":"https://","promo":[]}
对象
result.send({ "promoPerCategory": promoPerCategory })
为空数组 最佳答案
第一个问题是result.send
没有等待getPromoPerCategories
结果。要做到这一点,result.send
需要回调getPromoPerCategories
承诺。看起来您还希望在调用result.send
之前等待所有结果返回,因此您应该使用Promise.all
并等待所有getPromoPerCategories
承诺。例如:
categories.then(function (val) {
let promoPerCategory = [],
promoPerCategoryPromises = [];
for (let i = 0, len = val.length; i < len; i++) {
let json = {
category: val[i].category,
url: val[i].url,
promo: []
}
var promise = scrapper.getPromoPerCategories(val[i].url)
.then(function (allPromo) {
for (let j = 0, lenResult = allPromo.length; j < lenResult; j++) {
json.promo.push({
imageUrl: allPromo[j].imageUrl,
merchantName: allPromo[j].merchantName,
promoTitle: allPromo[j].promoTitle,
validUntil: allPromo[j].validUntil,
promoUrl: allPromo[j].promoUrl
});
console.log(json.promo[j]);
}
promoPerCategory.push(json);
});
promoPerCategoryPromises.push(promise);
}
Promise.all(promoPerCategoryPromises).then(function() {
result.send({ "promoPerCategory": promoPerCategory });
});
})