2016-11-17 75 views
3

我在努力学习使用诺言。 在这种情况下,我想做一个网络刮板。我在此代码中使用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工作正常,我打印出来使用console.log(json.promo[j])

的价值,但问题是我希望把阵列从json.promo[j]到数组promoPerCategory,这样我可以把它用result.send({ "promoPerCategory": promoPerCategory })

返回

你能帮我做正确的方法吗?任何帮助将非常感激。现在

结果是这样的

{"promoPerCategory": [{"category":"Fashion","url":"https://","promo":[]} 

对象promo是空数组

回答

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 }); 
    }); 
}) 
+0

现在很清楚,先生!谢谢你的工作。 – lloistborn

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); 
}); 
+0

我相信你的第一个例子它会发送一个空数组。 'promise.send'将在promise被解析之前被调用。第二个例子会工作。 – Chev

+0

是的,它是,我不知道如何解决它。亚历杭德罗答案是完美的。先生,谢谢你的回答。 – lloistborn