我正在閱讀有關 Promises 的博客,它們顯示了一個我根本不明白的問題。博客是:https : //pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html。
作者提出了 4 個帶有圖形解決方案的謎題:
謎題#1
doSomething().then(function () {
return doSomethingElse();
}).then(finalHandler);
謎題#2
doSomething().then(function () {
doSomethingElse();
}).then(finalHandler);
謎題#3
doSomething().then(doSomethingElse())
.then(finalHandler);
謎題#4
doSomething().then(doSomethingElse)
.then(finalHandler);
這里 doSomething() 和 doSomethingElse 是承諾。
誰能給大家詳細解釋一下?在第一個我得到執行順序。第二,我不明白為什么 doSomethingElse 和 finalHandler 同時開始和結束。第三,我不明白為什么 doSomething 和 doSomethingElse 同時開始。doSomethingElse 不應該在 doSomething 的末尾開始嗎?第四,我什么也沒得到...
uj5u.com熱心網友回復:
謎題 1
// doSomething() is executed and returns a promise
doSomething().then(function () {
// when doSomething() executes successfully, execute doSomethingElse() and return the Promise
return doSomethingElse();
}).then(finalHandler); // final handler will be executed once doSomethingElse has finished, since the promise was returned
謎題2
// doSomething() is executed and returns a promise
doSomething().then(function () {
// when doSomething() executes successfully, execute doSomethingElse()
doSomethingElse(); // execute doSomethingElse()
// since there is nothing returned here, the the promise will resolve immediatly, without waiting for doSomethingElse() to complete
}).then(finalHandler); // final handler will be executed immediatly after doSomethingElse() has started to execute, without waiting for a result.
謎題 3
在這個函式中,兩個函式同時啟動,因為.then需要一個函式作為它的第一個引數。doSomethingElse是一個函式,但是doSomethingElse()是一個函式呼叫。因此它被立即呼叫,并將.then()的回傳值作為第一個引數doSomethingElse,這是一個承諾。
doSomething().then(doSomethingElse())
.then(finalHandler);
拼圖 4
與拼圖 3 不同的是,函式 doSomethingElse被傳遞給.then(),而不是拼圖 3中的回傳值doSomethingElse。這意味著doSomethingElse將呼叫一次doSomething完成。
// the code below is a shortcut for doSomething().then(() => doSomethingElse())
doSomething().then(doSomethingElse)
.then(finalHandler);
函式與函式呼叫
您需要了解的是函式 ( doSomething) 和函式呼叫 ( doSomething())之間的區別。
function doSomething() {
return "something";
}
const func = doSomething;
const value = doSomething();
console.log(func);
console.log(value);
uj5u.com熱心網友回復:
謎題#1 和#4 以及謎題#2 和#3 是相同的。
在您的謎題 #2 中,您啟動另一個 Promise 并立即回傳,無需等待。所以你的 finalHandler 將在 doSomethingElse 啟動后立即被呼叫,而不是在它完成后。如果您愿意,請使用您的拼圖 #1
在您的謎題 #3 中,您直接傳遞 doSomethingElse() 回傳的已啟動 Promise,而不是告訴 js 在 doSomething 解決時呼叫該函式。如果你想這樣做,就這樣寫——這可能有助于避免混淆
doSomething()
.then(() => doSomethingElse())
.then(() => finalHandler());
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318767.html
標籤:javascript 节点.js 异步
