我正在努力学习使用诺言。
在这种情况下,我想制作一个网络刮板。我在此代码中使用request-promise
。
实际上刮板工作正常。我误解了如何使用then()
内的返回值。我也用Google搜索了,但没有运气,仍然卡住了。这是我的代码。
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
工作正常,我使用console.log(json.promo[j])
打印出值
但问题是我想将json.promo[j]
中的数组放入数组promoPerCategory
,以便我可以使用result.send({ "promoPerCategory": promoPerCategory })
你能帮我做正确的方法吗?任何帮助将非常感激。
结果现在就像这样
{"promoPerCategory": [{"category":"Fashion","url":"https://","promo":[]}
对象promo
是空数组
答案 0 :(得分:4)
您的第一个问题是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 });
});
})
答案 1 :(得分:0)
var data = [];
scrapper.getPromoPerCategories(val[i].url)
.then(function() {
data.push({'foo': 'bar'});
});
result.send(data);
或者您可以在承诺链中result.send()
。
.then(function() {
var data = [];
data.push({'foo': 'bar'});
result.send(data);
});