如何在内部超时的情况下获取地图中的所有承诺

问题描述

我正在尝试从超时的地图中获取所有结果。

我曾尝试使用 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
  });