如何获取承诺内的价值?

时间:2016-11-17 20:18:32

标签: node.js express promise

我正在努力学习使用诺言。 在这种情况下,我想制作一个网络刮板。我在此代码中使用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是空数组

2 个答案:

答案 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);
});