延迟承诺

Putting up delay in promises

所以,我有两个承诺,我想在屏幕上打印,中间有 3 秒的延迟。我将如何实现它。下面是代码。

const promiseOne = new Promise(function(resolve, reject) {
  resolve("Hello")
});

const promiseTwo = new Promise(function(resolve, reject) {
  resolve("Good Morning")
});

Promise.all([promiseOne, promiseTwo]).then(function() {
  setTimeout(() => {
    const response = Promise.all.next();
    console.log(response);
  }, 3000);
});

您已经非常接近了,您只需要从 Promise.all 的结果中接收值,然后处理该信息,如下所示:

const promiseOne = new Promise(function(resolve) {
    resolve("Hello")
});

const promiseTwo = new Promise(function(resolve) {
   resolve("Good Morning");
});

Promise.all([promiseOne, promiseTwo])
    .then(function(response) {
        setTimeout(() => {
            console.log(response);
        }, 3000);
    });


编辑 根据 OP 给出的说明,他需要的是以下内容:

第一个promise解决后,等待3秒再执行第二个promise。

const promiseOne = new Promise(function(resolve) {
    resolve("Hello")
});

const promiseTwo = new Promise(function(resolve) {
   resolve("Good Morning");
});


async function resolveWithDelay(delay = 3000) {
    const res1 = await promiseOne;
    console.log(res1);

    setTimeout(async () => {
        const res2 = await promiseTwo;
        console.log(res2);
    }, delay);
}

resolveWithDelay();

const promiseOne = new Promise(function(resolve, reject) {
    resolve("Hello")
});

const promiseTwo = new Promise(function(resolve, reject) {
    resolve("Good Morning")
});

Promise.all([promiseOne, promiseTwo]).then(function(all) {
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(all);
        }
        , 3000);
    });

}).then(console.log)

Return then 中的新 Promise,该 Promise 等待 x 毫秒并解决它。

接下来做任何事情then

如果您只想延迟日志,那么您可以添加 response 参数,如 所述。

但是如果你想延迟 response 从承诺 promiseOnepromiseTwo 中的任何一个,那么你应该在各自的承诺中使用 setTimeout(() => resolve("Hello"), 300); ,如下所示。也不要在 Promise.All.

中使用 setTimeout

根据 ,在 promiseOne 解决后,我更新了对 resolve promiseTwo 3 seconds 的回答。

这里我把promiseTworesolve赋值给了全局变量resolvePromiseTwo,在promiseOne里面用到resolvepromiseTwo之后3秒。

注意我在promiseOnepromiseTwo之后用了.then只是为了验证output。你可以省略两者。

let resolvePromiseTwo = null;

const promiseOne = new Promise(function(resolve, reject) {
  resolve("Good Morning")
  setTimeout(() => resolvePromiseTwo("Hello"), 3000);
}).then(res => {
  console.log('promiseOne resolved');
  return res;
});

const promiseTwo = new Promise(function(resolve, reject) {
  resolvePromiseTwo = resolve;
}).then(res => {
  console.log('promiseTwo resolved');
  return res;
});

Promise.all([promiseOne, promiseTwo]).then(function(response) {
  console.log('Promise.all');
  console.log(response);
});

我建议你使用延时功能。首先,您遍历数组中的每个响应并使用

之间的延迟

const promiseOne = new Promise(function(resolve, reject) {
  resolve("Hello")
});

const promiseTwo = new Promise(function(resolve, reject) {
  resolve("Good Morning")
});
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Promise.all([promiseOne, promiseTwo]).then(async function(resps) {
     
   for(let res of resps){
   console.log(res);
    await delay(3000)
   }   
});