在while(JavaScript / Node.js)中如何使用Promise?

我正在尝试通过使用promise和while(JavaScript / Node.js)依次重复执行多个进程。 但是,未执行promise函数(即,从不显示所有console.log())。

为什么promise函数不会在一段时间内执行?

另外,如何依次重复显示一些console.log()?

$data
lotusdy 回答:在while(JavaScript / Node.js)中如何使用Promise?

.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();

,

发生了什么-用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));
}
,

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

,

您需要将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");
});
本文链接:https://www.f2er.com/3132005.html

大家都在问