2017-03-01 18 views
1

私は約束を返す関数を持っています。この機能では、サードパーティのベンダーにサーバー経由でプッシュ通知を送信するよう呼びます。返す前に数秒待つことを約束します

事は、我々は本当にこのsendMessage関数を呼び出す前に、3秒間待つことにしたあるしかしそれは

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

のように見えます。しかし、sendMessageが提供されてから変更することは望ましくありません。

「同期」操作を削除するために約束が使われているので、このシナリオで実際に「待機」部分をどうやって行うのかと思います。

正しく理解していますか?何をすればよいでしょうか?

+0

約束の作成でこれを行い、約束を後で返してください –

+0

'setTimeout'を試しましたか?そのアプローチを考えた場合、3秒後に 'sendMessage'によって約束を返すためにコールバックが必要になるかもしれません。 – 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

異なるアプローチ - あなたは多くの場所

にこの種のものをしたい場合は、このビットは便利に1回だけ実行する

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)); 
関連する問題