2017-03-01 46 views
1

我有一個函數返回一個promise。在這個功能中,我們稱第三方供應商通過他們的服務器發送推送通知。讓我們等待幾秒鐘後再返回

它看起來像

apiGetLoggedInUser.then(
    user => { 
    return sendMessage(user.name); 
    } 
) 

然而事情是我們決定等待3秒,我們真的叫這個SendMessage函數之前。但是,我們不希望自提供sendMessage以來更改它。

我不知道如何真正做到「等待」的一部分在這種情況下,因爲承諾是用來清除「同步」操作。

我理解正確嗎?我該怎麼辦?

+0

你應該在承諾創建時做到這一點,並在以後返回承諾 –

+0

你嘗試過使用'setTimeout'嗎?如果你考慮這種方法,你可能需要一個回調來處理'sendMessage'在3秒後的承諾返回。 – Noctisdark

回答

0

創建新的承諾,超時之後會調用sendMessage

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

插入其中延遲鏈中的另一個承諾下一個:

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

工程就像一個魅力! –

+0

後續問題:這是否會阻止主循環?如果有,有什麼辦法可以緩解?謝謝@deceze –

+1

不,這不會阻止。 – deceze

0

一種不同的方法 - 如果你想要做這樣的事情在很多地方

這一點是非常有用的做一次

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)); 
相關問題