Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 让我等几秒钟再回来_Javascript_Node.js_Express_Promise - Fatal编程技术网

Javascript 让我等几秒钟再回来

Javascript 让我等几秒钟再回来,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,我有一个函数返回一个承诺。在这个函数中,我们调用第三方供应商通过其服务器发送推送通知 看起来像 apiGetLoggedInUser.then( user => { return sendMessage(user.name); } ) 但问题是,我们决定等待3秒钟,然后才能真正调用此sendMessage函数。但是,我们不希望更改sendMessage,因为它是提供的 我想知道如何在这个场景中真正执行“等待”部分,因为promise用于删除“同步”操作 我理解正确吗?我该

我有一个函数返回一个承诺。在这个函数中,我们调用第三方供应商通过其服务器发送推送通知

看起来像

apiGetLoggedInUser.then(
  user => {
    return sendMessage(user.name);
  }
)
但问题是,我们决定等待3秒钟,然后才能真正调用此sendMessage函数。但是,我们不希望更改sendMessage,因为它是提供的

我想知道如何在这个场景中真正执行“等待”部分,因为promise用于删除“同步”操作


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

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

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

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

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

另一种方法——如果您想在许多地方做这类事情,那么它很有用

这一点只做一次

Promise.prototype.thenWait = function thenWait(time) {
    return this.then(result => new Promise(resolve => setTimeout(resolve, time, result)));
};
然后你可以在任何地方使用它,就像你的例子中的这个用法一样

apiGetLoggedInUser.thenWait(3000).then(user => sendMessage(user.name));
简短版本:

function wait(milliseconds) {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
}
例如:

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

  sendMessage(user.name);
}

您应该在创建承诺时执行此操作,然后返回承诺。您是否尝试使用
setTimeout
?如果你考虑这个方法,你可能需要一个回调来处理允诺返回,在3s之后通过代码> SDENMENT/<代码>。后续问题:这会阻止主循环吗?如果是的话,有什么方法可以缓解?谢谢@decezeNo,这不会阻塞。它不会阻塞的原因是承诺与来自内存的wait&async一起工作。