2015-09-28 3 views
0

Я работаю над приложением NodeJS, которое извлекает много информации из разных API.Существует таймаут по умолчанию с q.allSettled?

Во время самой большой выборки, у меня есть некоторые проблемы с моими обещаниями.

Я предполагаю начать слишком много запросов и слишком Fastly ...

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

Спасибо для вашей помощи, результаты будут успешными сейчас :) Но цикл forEach не возвращает обещание, поэтому «.then» после него выполняется до любого нажатия на all_consumption ... – Mech45

+0

@Leclerc это была опечатка, тогда 'метод должен быть установлен правильно после выполнения 'pwhile', например' pwhile(). then() '. Я исправил свой ответ. Кстати, если это было полезно для вас, пожалуйста, повысьте его, нажав на стрелку и пометьте ее как принятую, нажав на кнопку «V» справа под ней. Благодаря! :) – Buzinas

Смежные вопросы