Обещания Bluebird: последовательное асинхронное выполнение связанных обещаний с циклами for внутри - PullRequest
0 голосов
/ 12 апреля 2020

Чтобы избежать ада обратного вызова, я объединяю несколько инструкций (Bluebird Promise), каждая из которых работает асинхронно для l oop. Вместо того, чтобы ждать каждого от l oop до fini sh, цепочка устремляется прямо к концу, где она показывает «DONE», пока циклы for все еще работают. Как я могу изменить свои циклы for так, чтобы цепочка обещаний "ждала" каждого из них до конца sh, прежде чем выполнить следующий раздел "then"?

return Object1.Asyncmethod1(param1)
  .then(function(result1) {

    var promiseFor = Promise.method(function(condition, action, value) {
      if (!condition(value)) return value;
      return action(value).then(promiseFor.bind(null, condition, action));
    });

    promiseFor(function(count) {
      return count < result1.length;
    }, function(count) {
      return Object.someOtherAsyncAction(someParam)
        .then(function(res) {
          return ++count;
        });
    }, 0)

  }).then(function(result2) {
    //another for loop just like the one above  
  }).then(function(result3) {
    console.log("DONE");
    res.json({
      result: result3
    });
  }).catch(function(err) {
    res.json({
      result: 'error:' + err
    });
  });

1 Ответ

0 голосов
/ 12 апреля 2020

Вы не возвращаете обещание, созданное promiseFor. По этой причине цепочка разорвана, и .then(function(result2) { не ожидает завершения этого кода. Вам нужно добавить return перед promiseFor(function(count) {

  .then(function(result1) {

    var promiseFor = Promise.method(function(condition, action, value) {
      if (!condition(value)) return value;
      return action(value).then(promiseFor.bind(null, condition, action));
    });

    return promiseFor(function(count) {
      return count < result1.length;
    }, function(count) {
      return Object.someOtherAsyncAction(someParam)
        .then(function(res) {
          return ++count;
        });
    }, 0)

  })
...