添加延迟承诺
问题描述:
,所以我有创造的诺言时,我做了一定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]});
}
});
但问题在于:我愿意在每个承诺之间添加延迟。 有什么想法?
答
您可能有可能使用循环索引来计划未来时间内承诺中的每个任务。例如,您的代码的顶部部分将如下所示。
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);
}
答
如果你想要这些功能之间的延迟,那么你不应该首先使用Promise.all
。
当您使用async
和await
加上蓝鸟一些不错的插件,那么你就可以用优雅的事情是这样的:
const { delay } = require('bluebird');
和异步功能:
doSomething();
await delay(100);
doSomethingElse();
await delay(3000);
// ...
任何时候如果你不想让你的代码变得太复杂,你需要使用复杂的时间依赖逻辑。
欲了解更多信息,请参见:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
对于节点支持,请参阅:
在你不必为async
本地支持和地方await
你可以用巴贝尔:
或有稍微不同的语法发电机基础的做法就像在co
或蓝鸟协程:
会这样的帮助 https://www.npmjs.com/package/delay-promise – Anirudh