2017-09-29 16 views
0

私は約束しているチェーンを順番に実行しています。しかし、私はそれらのうちの1つを遅らせ、遅延されたものが完了するまで他のものを実行させたくない。これをどのように達成するのですか?私はsetTimeOutを試しましたが、約束が非同期なのでタイムアウトが期待通りに機能しないようです。プロミスチェーンの.then()内でタイムアウトを設定する方法

var p = Promise.resolve("Hello"); 

p.then((result) => { 
    console.log(result); 
    console.log("========== Then Block 1"); 
    return "how are you"; 
}).then((result)=>{ 
    console.log(result); 
    console.log("========== Then Block 2"); 
    return "I'm Fine! Thank you" 
}).then((result) => { 

    setTimeout(function(){ 
    console.log("Time out Done!"); 
    }, 3000); 

    console.log(result); 
    console.log("========== Then Block 3"); 
}).then(()=>{ 
    console.log("========== Then Block 4"); 
}) 

この版画:

"Hello" 
"========== Then Block 1" 
"how are you" 
"========== Then Block 2" 
"I'm Fine! Thank you" 
"========== Then Block 3" 
"========== Then Block 4" 
"Time out Done!" 

私が代わりにしたいことは次のとおりです。

"Hello" 
"========== Then Block 1" 
"how are you" 
"========== Then Block 2" 
"I'm Fine! Thank you" 
"Time out Done!" 
"========== Then Block 3" 
"========== Then Block 4" 
+0

のsetTimeout非同期です。 – Walk

答えて

0

は、新しい約束を作成し、setTimeoutコールバックの内側にそれを解決:

Promise 
    .resolve("Hello") 
    .then((result) => { 
    console.log(result); 
    console.log("========== Then Block 1"); 
    return "how are you"; 
    }) 
    .then(result => { 
    console.log(result); 
    console.log("========== Then Block 2"); 
    return "I'm Fine! Thank you"; 
    }) 
    .then(result => new Promise(resolve => { // <== create a promise here 
    setTimeout(function() { 
     console.log("Time out Done!"); 
     console.log(result); 
     console.log("========== Then Block 3"); 
     resolve(); // <== resolve it in callback 
    }, 3000); 
    })) 
    .then(() => { 
    console.log("========== Then Block 4"); 
    });