2016-11-17 49 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