Как использовать обещание в то время как (JavaScript / Node.js)? - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь выполнить несколько процессов последовательно, используя обещание и while (JavaScript / Node.js). Однако функция обещания не выполняется (т. Е. Все console.log () никогда не отображаются).

Почему функция обещания никогда не выполняется в это время?

Кроме того, как я могуотображать несколько console.log () несколько раз подряд?

var count = 0;
while(count < 5) {
  Promise.resolve()
  .then(function () {
    return new Promise(function(resolve, reject) {
      console.log('func1()...');
      resolve('OK');
    });
  })
  .then(function(value) {
    return new Promise(function(resolve, reject) {
      console.log('func2()...');
      resolve('OK');
    });
  })
  .then(function (value) {
    console.log('func3()...');
    count++;
  }).catch(function (error) {
    console.log(error);
  });
}

Ответы [ 4 ]

1 голос
/ 09 ноября 2019

.then() по-прежнему остается асинхронным обратным вызовом, см. Порядок сообщений здесь:

Promise.resolve().then(()=>console.log("got resolved"));
console.log("got here");

Одна вещь, которую вы можете сделать, это свернуть код в async function:

async function test(){
  var count = 0;
  while(count < 5) {
    await Promise.resolve()
    .then(function () {
      return new Promise(function(resolve, reject) {
        console.log('func1()...');
        resolve('OK');
      });
    })
    .then(function(value) {
      return new Promise(function(resolve, reject) {
        console.log('func2()...');
        resolve('OK');
      });
    })
    .then(function (value) {
      console.log('func3()...');
      count++;
    }).catch(function (error) {
      console.log(error);
    });
  }
}

test();
0 голосов
/ 09 ноября 2019

Вам нужно использовать Promise.all() вместе с async.eachSeries для зацикливания. Для этого вам нужно установить async , а затем сделать следующее:

const async = require('async');
var count = [...Array(5).keys()];
async.eachSeries(count, (c, next) => {
  Promise.all([
    new Promise(function (resolve, reject) {
      console.log('func1()...');
      resolve('OK');
    }), 
    new Promise(function (resolve, reject) {
      console.log('func2()...');
      resolve('OK');
    })]).then(function (values) {
    console.log('func3()...');
    next();
  });
}, (err) => {
  console.log("here we done");
});
0 голосов
/ 09 ноября 2019

var count = 0;
while(count < 5) {
  Promise.resolve()
  .then(function () {
    return new Promise(function(resolve, reject) {
      console.log('func1()...');
      resolve('OK');
    });
  })
  .then(function(value) {
    return new Promise(function(resolve, reject) {
      console.log('func2()...');
      resolve('OK');
    });
  })
  .then(function (value) {
    console.log('func3()...');
  }).catch(function (error) {
    console.log(error);
  });
  count++;
}
0 голосов
/ 09 ноября 2019

Что происходит - в Javascript цикл обработки событий и исходный код, который вы пишете, выполняются в одном потоке. Это означает, что если этот поток заблокирован какой-либо работой, больше ничего не выполняется. Это работает довольно просто - цикл обработки событий принимает одно событие (код, который вы показываете), обрабатывает ВСЕ синхронные части и выталкивает любые асинхронные вещи (цепочку обещаний) в цикл событий, который будет выполнен позже.

Проблема заключается в следующем:

var count = 0;
while(count < 5) {
  Promise.resolve()
  .then(
  // some promise chain...
}

while перехватывается в бесконечном цикле, так как вся синхронная часть состоит в том, что он запускает эту цепочку Promise в цикле событий и затем запускается снова. count никогда не изменяется в этом контексте.

Лучше всего использовать async/await, который решает именно то, что вы хотите, без необходимости глубокого понимания Node.js

Другой вариант:использовать рекурсию

function promiseChain() {
  return Promise.resolve()
  .then(function () {
    return new Promise(function(resolve, reject) {
      console.log('func1()...');
      resolve('OK');
    });
  })
  .then(function(value) {
    return new Promise(function(resolve, reject) {
      console.log('func2()...');
      resolve('OK');
    });
  })
  .then(function (value) {
    console.log('func3()...');
    count++;
  }).catch(function (error) {
    console.log(error);
  });
}

recursivelyExecute(promise, count) {
  if (count > 5) {
    return;
  }
  count++;
  return promise.then(() => recursivelyExecute(promiseChain(), count+1));
}
...