我在努力学习使用承诺。
在这种情况下,我想做一个网络刮刀。我在这段代码中使用了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 fromconsole.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 });
    });
})

07-26 04:40