让我们承诺在返回之前等待几秒钟

edd*_*xie 8 javascript node.js promise express

我有一个函数返回一个承诺.在此功能中,我们呼叫第三方供应商通过其服务器发送一些推送通知.

看起来像

apiGetLoggedInUser.then(
  user => {
    return sendMessage(user.name);
  }
)
Run Code Online (Sandbox Code Playgroud)

然而事情是我们决定等待3秒才真正调用这个sendMessage函数.但是我们宁愿不更改sendMessage,因为它已经提供了.

我想知道如何在这种情况下真正做"等待"部分,因为promise用于删除"同步"操作.

我理解正确吗?我该怎么办?

Dar*_*ron 12

简短版本:

function wait(milliseconds) {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
}
Run Code Online (Sandbox Code Playgroud)

例子:

async function myFunc(user) {
  await wait(3000);

  sendMessage(user.name);
}
Run Code Online (Sandbox Code Playgroud)


dec*_*eze 11

在链中插入另一个延迟下一个的承诺:

apiGetLoggedInUser
    .then(user => {
        return new Promise(resolve => setTimeout(() => resolve(user), 3000));
    })
    .then(user => sendMessage(user.name))
Run Code Online (Sandbox Code Playgroud)


Jar*_*a X 5

一种不同的方法 - 如果你想在很多地方做这种事情,很有用

这一点做一次

Promise.prototype.thenWait = function thenWait(time) {
    return this.then(result => new Promise(resolve => setTimeout(resolve, time, result)));
};
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何地方使用它,就像你的例子一样

apiGetLoggedInUser.thenWait(3000).then(user => sendMessage(user.name));
Run Code Online (Sandbox Code Playgroud)


rad*_*men 2

sendMessage创建新的承诺,该承诺将在超时后调用。

apiGetLoggedInUser.then(
  user => {
    return new Promise((resolve, reject) => {
       setTimeout(() => {
          sendMessage(user.name).then(resolve, reject);
       }, 3000)
    });
  }
)
Run Code Online (Sandbox Code Playgroud)