延迟承诺

时间:2017-04-24 10:35:49

标签: node.js es6-promise

所以当我向某个Url发出请求时,我有一个创建承诺的循环:

$myMailAlert->to

之后我在csv文件中写了我的承诺的结果:

for (let j = 1; j < nbRequest; j++)

{
 const currentPromise = new Promise((resolve, reject) => {
    request(
      `someUrl${j}`,
      (error, response, body) => {
        if(error || !response) {
          console.log("Error: " + error);
        }

    console.log("Status code: " + response.statusCode + ", Connected to the page");

    var $ = cheerio.load(body);
    let output = {
      ranks: [],
      names: [],
      numbers: [],
    };

   //some stuff to do

    console.log("HERE 1");
    return resolve(output);
  }
);
  });
  promises.push(currentPromise);
}

但是问题在于:我愿意在每个承诺之间加上延迟。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您希望在这些功能之间出现延迟,那么您首先不应该使用Promise.all

当您使用asyncawait以及Bluebird作为一些不错的插件时,您就可以使用这样的优雅内容:

const { delay } = require('bluebird');

并在异步函数中:

doSomething();
await delay(100);
doSomethingElse();
await delay(3000);

// ...

如果您不需要复杂的时间相关逻辑,如果您不希望代码过于复杂,则应该使用async / await

有关详细信息,请参阅:

有关Node的支持,请参阅:

在您没有asyncawait原生支持的地方,您可以使用Babel:

或略有不同的语法基于生成器的方法,如co或Bluebird协同程序:

答案 1 :(得分:0)

您可以使用循环索引来计划未来时间内承诺中的每个任务。例如,您的代码的顶部部分将如下所示。

for (let j = 1; j < nbRequest; j++) {
  const currentPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      request(
        `someUrl${j}`,
        (error, response, body) => {
          if (error || !response) {
            console.log("Error: " + error);
          }
          console.log("Status code: " + response.statusCode + ", Connected to the page");

          var $ = cheerio.load(body);
          let output = {
            ranks: [],
            names: [],
            numbers: [],
          };

          //some stuff to do

          console.log("HERE 1");
          return resolve(output);
        })
    }, 1000 * j);
  });
  promises.push(currentPromise);
}