2016-03-11 4 views
0

Я надеюсь, что кто-то может помочь мне лучше понять обещания. Я довольно новичок с ними. Я делаю запрос БД с обещаниями, когда результат верен, получите массив данных. Затем мне нужно сделать цикл, итерации этого массива и выполнить для каждой операции удаления элемента и после этого удалить операцию на другую операцию отправки, когда обе операции закончены, затем повторить процесс для каждого элемента массива, но его необходимо завершить для каждый элемент завершает операцию и посылает операцию перед запуском другого элемента массива ... с моим кодом, которого не происходит, цикл делает операцию удаления для каждого элемента, не ожидая результата возврата и отправки операции. Обе операции удаляют и доставка имеют структуруПравильный способ сделать цикл с обещанием Q.js в nodejs

function x (makeQuery){ 
    ....... 
    var deferred = Q.defer(); 
    ..... 
    function(err, result) { 
        if (err) { 
         deferred.reject(err); 
        } else { 
        deferred.resolve(result); 
        } 

       }); 
    return deferred.promise; 
} 

И мой код:

getElementInPostgres(makeQuery) 
     .then(function (obj) { 
      if (...){ 
       results= obj['rows'] 
       index =0 
       for (var i = 0; i < results.length; i++) { 
        var notification = {} 
        notification.tag='SubscriptionNode' 
        notification.indexSocket=results[i]['indexsocket'] 
        notification.clientID=results[i]['clientid'] 
        notification.callbackURL=results[i]['callbackurl'] 
        notification.deploymentID=results[i]['deploymentid'] 
        notification.clusterID=results[i]['clusterid'] 
        notification.date=results[i]['registered'] 
        var query = "DELETE FROM....."; 
        var params = [notification.indexSocket]; 
        deleteInPostgres(query,params,notification) 
        .then(function (notification) { 
         if(notification.clientID){ 
          sendInfoToPython(notification) 
          .then(function (obj) { 
           .......... 
          }).fail(function (err) { 
           ...... 
          }); 
         } 

        }).fail(function (err) { 
        ...... 
        }); 
       } 
       } 
       else{ 
       ......... 
       } 
       }).fail(function (err) { 

       }); 
+0

Возможный дубликат http://stackoverflow.com/questions/24660096/correct-way-to-write-loops-for-promise? – zangw

+0

Я не работаю с bluebird, я работаю с Q.js – AnD

+0

https://gist.github.com/neilk/6431795, образец кода Q.js, может помочь вам ... – zangw

ответ

1

Вы можете продолжать использовать Q, но для итерации первого результата вы можете использовать async.each (https://github.com/caolan/async#each). В итерации вы можете выполнить задачу удаления. В обратном вызове итерации возобновите операцию отправки. Это сделает ваш код более простым и менее подробным.

+0

Спасибо Голаку, я использовал async, но не async.each. Я использовал async.parallel(). – AnD

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

  • Нет связанных вопросов^_^