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一起工作。