2017-08-24 72 views
0

可以說我有下面的代碼:Promise.All後,你可以繼續同步嗎?

var myData = []; 

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{ 
    var myData = result [] 
}).catch((err)=>{ 
    \\Do something with err 
}) 

doSomething (myData); 

我可以做一些myData的,已收到promise.all結果後的數據?或者我必須處理Promise中的後續代碼.then()。

例如:

future.then((data)=>{ 
    doSomething(myData); 
}); 

我覺得自己必須創建一堆。那麼()的,以保持處理任何類型的同步代碼。雖然我想既然是myData的結果,然後使用在結果的數據的任何代碼應該像承諾的一部分進行處理:

var future = Promise.All([getPromise1, getPromise2]).then((result)=>{ 
    doSomething(result []) 
}).catch((err)=>{ 
    \\Do something with err 
}) 

上午我剛認識這一切錯了嗎? 期待您的想法和意見!

P.S IM上的node.js

+0

你可以把你的東西同步到一個函數,所以你需要調用*然後(yourFunction中)*只有一次。 – Robert

+2

簡短回答是否定的,因爲異步代碼總是異步的 - 長答案是,你可以使你的代碼看起來像你想要的,使用async/await - 參見https://jsfiddle.net/4ghfdjcy/ - 或者更正確的https: //jsfiddle.net/4ghfdjcy/1/ –

回答

0

你是正確的工作,承諾的結果只能是承諾的。然後內使用。

附註 - 後續承諾不一定需要嵌套,而是可以鏈接。例如:

myPromise(foo).then(bar => { 
    // Do something with the result 
    baz = bar * 2 

    // Pass the result to some other promise 
    return mySecondPromise(baz) 
}).then(foo2 => { 
    // Output the result of the second promise 
    console.log(foo2) 
}).catch(err => { 
    console.error(err) 
}); 

錯誤將沿着鏈條傳播。

0

您將不得不處理.then()函數回調中的後續代碼。在承諾鏈之外無法做任何事情的原因是因爲Promises的工作方式。快速谷歌搜索關於異步JavaScript給出an explanation這是爲什麼。簡短的回答是doSomething(myData)將在.then()函數的代碼運行之前運行,這意味着當腳本到達代碼中的那一點時,myData仍然是一個空數組。

其實即使代碼的doSomething(myData)方法之前根本不知何故達到.then()功能,myData的仍然是一個空數組,因爲中的myData的.then()函數聲明是另一個變量完全,因爲它被聲明爲

var myData 

如果你想編寫代碼看起來更同步,我建議使用async/await,這取決於你的node.js版本是否支持它,或者如果你正在使用轉譯器。隨着異步/等待你的代碼看起來像:

async function() { 
    try { 
     var myData = await Promise.all([getPromise1, getPromise2]); 
     doSomething(myData); 
    } catch (ex) { 
     // Do something with err 
    } 
} 
+0

糾正我,如果我錯了,但var myData具有全局範圍。如果Promise.All解決然後。((結果))可以放在myData,然後從那裏同步繼續執行doSomething(myData) –

+0

我想你的意思是myData可以放在.then(result => {。 ..}) 回電話?是的,你只需要在回調中的myData之前刪除'var'關鍵字來引用全局myData對象。 –

+0

我甚至沒有注意到額外的變種。謝謝。 –

相關問題