2015-09-28 94 views
0

我正在從一個NodeJS應用程序中獲取大量來自不同API的信息。q.allSettled有默認的超時時間嗎?

在最大的抓取過程中,我對我的承諾有一些問題。

我想我推出了太多的要求,太快速度......

var promises = []; 
 
list_consumptions.forEach(function (item) 
 
{ 
 
    item.consumptions.forEach(function (data) 
 
    { 
 
    promises.push(getDetails(item.line, data)); 
 
    }); 
 
});

在getDetails()

function getDetails(line, item) 
 
{ 
 
    var deferred = Q.defer(); 
 
    var result = []; 
 
    ovh.request('GET', '/telephony/*******/service/' + line + '/voiceConsumption/' + item, function (err, fetched_data) 
 
    { 
 
     if (!err) 
 
     { 
 
     result = { 
 
      'line': line, 
 
      'consumption_id': item, 
 
      'type': fetched_data.wayType, 
 
      'calling': fetched_data.calling, 
 
      'called': fetched_data.called, 
 
      'plan_type': fetched_data.planType, 
 
      'destination_type': fetched_data.destinationType, 
 
      'date': fetched_data.creationDatetime, 
 
      'duration': fetched_data.duration, 
 
      'price': fetched_data.priceWithoutTax 
 
     }; 
 
     // console.log("RESULT: ",result); 
 
     deferred.resolve(result); 
 
     } 
 
     else 
 
     { 
 
     deferred.reject(err); 
 
     console.log(err); 
 
     } 
 
    }); 
 
    return deferred.promise; 
 
}

在循環後:

Q.allSettled(promises).done(function(final_result) 
 
    { 
 
    final_result.forEach(function (promise_fetch){ 
 
     if (promise_fetch.state != 'fulfilled') 
 
     { 
 
     console.log("ERREUR Merge"); 
 
     } 
 
     else 
 
     { 
 
     all_consumptions.push(promise_fetch.value); 
 
     } 
 
     deferred.resolve(all_consumptions); 
 
    }); 
 
    return deferred.promise; 
 
    });

有了這個代碼,我有專門記錄錯誤:400

我想嘗試我的循環與一些setTimeout的放緩,在這種情況下, ,取得成功,但我的q.allSettled跳躍...我真的失去了...

任何想法來改善我的承諾句柄/循環句柄? 我很確定你已經知道了,但這是我第一週的JS ...和nodeJS。

非常感謝您的幫助...

回答

1

你可以使用一個承諾環,就像這樣:

function pwhile(condition, body) { 
    var done = Q.defer(); 

    function loop() { 
    if (!condition()) 
     return done.resolve(); 
    Q.when(body(), loop, done.reject); 
    } 

    Q.nextTick(loop); 

    return done.promise; 
} 

然後,你的代碼將是:

list_consumptions.forEach(function (item) { 
    var i = 0; 
    pwhile(function() { return i < item.consumptions.length; }, function() { 
    i++; 
    return getDetails(item.line, data) 
     .then(function(res) { 
     all_consumptions.push(res); 
     }) 
     .catch(function(reason) { 
     console.log("ERREUR Merge"); 
     }); 
    }).then(function() { 
    // do something with all_consumptions here 
    }); 
}); 
+1

謝謝爲了你的幫助,現在resquests成功了:)但是forEach的循環沒有返回一個承諾,所以在它之後的「.then」,在任何推動all_consumption之前執行... – Mech45

+0

@Leclerc這是一個錯字,然後是'then '方法應該放在正確的位置在執行'pwhile'之後,例如'pwhile()。then()'。我已經解決了我的答案。順便說一下,如果它對你有用,請點擊箭頭並點擊它旁邊的'V',將它標記爲已接受。謝謝! :) – Buzinas