我有一个返回承诺的函数。在此功能中,我们呼叫第三方供应商通过其服务器发送一些推送通知。
看起来像
apiGetLoggedInUser.then(
user => {
return sendMessage(user.name);
}
)
然而事情是我们决定等待3秒才真正调用这个sendMessage函数。但是我们宁愿不更改sendMessage,因为它已经提供了。
我想知道如何在这种情况下真正做“等待”部分,因为promise用于删除“同步”操作。
我理解正确吗?我该怎么办?
答案 0 :(得分:9)
在链中插入另一个延迟下一个的承诺:
apiGetLoggedInUser
.then(user => {
return new Promise(resolve => setTimeout(() => resolve(user), 3000));
})
.then(user => sendMessage(user.name))
答案 1 :(得分:3)
一种不同的方法 - 如果你想在很多地方做这类事情很有用
此位完成一次
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));
答案 2 :(得分:2)
简短版本:
function wait(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
示例:
async function myFunc(user) {
await wait(3000);
sendMessage(user.name);
}
答案 3 :(得分:1)
创建新的承诺,在超时后调用sendMessage
。
apiGetLoggedInUser.then(
user => {
return new Promise((resolve, reject) => {
setTimeout(() => {
sendMessage(user.name).then(resolve, reject);
}, 3000)
});
}
)