2017-04-24 98 views
0

,所以我有创造的诺言时,我做了一定URL的请求一个循环:添加延迟承诺

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); 
} 

之后,我写我的承诺,结果在一个CSV文件:

Promise.all(promises).then((outputs) => { 
    console.log('Request received'); 
    let ranks; 
    let names; 
    let numbers; 

    outputs.forEach((output) => { 
    ranks = _.concat(ranks, output.ranks); 
    names = _.concat(names, output.names); 
    numbers = _.concat(numbers, output.numbers); 
    }); 

    for (i = 0; i < ranks.length; i++) 
    { 
    writer.write({Rang: ranks[i], Nom: names[i] , Nombre: numbers[i]}); 
    } 
}); 

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

+0

会这样的帮助 https://www.npmjs.com/package/delay-promise – Anirudh

回答

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); 
} 
1

如果你想要这些功能之间的延迟,那么你不应该首先使用Promise.all

当您使用asyncawait加上蓝鸟一些不错的插件,那么你就可以用优雅的事情是这样的:

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

和异步功能:

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

// ... 

任何时候如果你不想让你的代码变得太复杂,你需要使用复杂的时间依赖逻辑。

欲了解更多信息,请参见:

对于节点支持,请参阅:

在你不必为async本地支持和地方await你可以用巴贝尔:

或有稍微不同的语法发电机基础的做法就像在co或蓝鸟协程: