问题描述
我正在尝试从超时的地图中获取所有结果。
我曾尝试使用 promise.all()
但它没有成功,因为 setTimeout
函数。
如果有人能看看我的代码并建议如何正确地做,我会很高兴。
非常感谢。
new Promise(async (resolve,reject) => {
Promise.all(
items.map(async (item,i) => {
await setTimeout(async () => {
return await SendMail(item);
},5000 * i);
})
).then((mailsRes) => {
resolve(mailsRes);
});
});
解决方法
在发送每封电子邮件后,只需循环浏览您的项目并休眠 x 秒(在本例中为 5 秒)。
const sleep = (milliSeconds) => {
return new Promise((resolve,_reject) => {
setTimeout(() => {
resolve()
},milliSeconds)
})
}
const sendEmails = async (items) => {
for (let i = 0; i < items.length; i++) {
const currentItem = items[i];
await SendMail(currentItem);
await sleep(5000)
}
}
如您所见,sendEmails 是一个异步函数,那么您可以通过以下方式调用它:
await sendEmails(items)
,
不确定您要实现的目标,但您可能需要这个-
async function timeout(interval) {
return new Promise(resolve => {
setTimeout(resolve,interval);
});
}
new Promise( async (resolve,reject) => {
Promise.all(items.map( async (item,i)=>{
await timeout(5000 * i).then(() => {
return await SendMail(item);
});
}))
.then(mailsRes => {
resolve(mailsRes)
})
});
问题是 setTimeout 会立即解决,并且您会在下一个回调中获得超时取消器。
,如果我理解正确的话,那可能就行了:
function delayedSendMail(item,i) {
return new Promise(resolve => setTimeout(() => resolve(SendMail(item)),5000 * i));
}
Promise.all(items.map((item,i) => delayedSendMail(item,i)))
.then(mailResults => {
// handle results
});