所以当我向某个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);
}
但是问题在于:我愿意在每个承诺之间加上延迟。 有什么想法吗?
答案 0 :(得分:1)
如果您希望在这些功能之间出现延迟,那么您首先不应该使用Promise.all
。
当您使用async
和await
以及Bluebird作为一些不错的插件时,您就可以使用这样的优雅内容:
const { delay } = require('bluebird');
并在异步函数中:
doSomething();
await delay(100);
doSomethingElse();
await delay(3000);
// ...
如果您不需要复杂的时间相关逻辑,如果您不希望代码过于复杂,则应该使用async
/ await
。
有关详细信息,请参阅:
有关Node的支持,请参阅:
在您没有async
和await
原生支持的地方,您可以使用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);
}