簡體   English   中英

ES6承諾-有人可以解釋這段承諾代碼嗎?

[英]ES6 promises - can somebody explain this piece of promises code?

有人可以解釋下面的代碼如何工作嗎?

var a = () => { 
  return Promise.resolve('aaa'); 
};

var b = () => { 
  return Promise.resolve('bbb'); 
};


a()
  .then(() => { b() })
  .then(console.log);  // logs undefined

a()
  .then(b())
  .then(console.log); // logs aaa

a()
  .then(b)
  .then(console.log); // logs bbb

我想知道在單個諾言上執行多個.then的順序,以及b()vs b vs諾言()=> {b()}如何使輸出有所不同。

Secnario答:第一個不從返回任何東西.then()處理程序(沒有return內聲明{}和箭頭的功能時,有不使用隱式返回{}所以從返回的值.then()處理函數undefined ,這就是您要記錄的內容。

.then(() => { b() })必須是以下任意一項才能正常工作:

.then(() => { return b() })     // since there are {}, you must have an actual `return`
.then(() => b())                // use implicit return in arrow function
.then(b)                        // just pass function reference directly

方案B:第二個方案過早調用b()並將返回值從b()傳遞到您的.then()處理程序。 .then()處理函數期望將函數引用傳遞給他們,而不是promise,因此他們不使用您傳遞給他們的promise(它們會忽略它,因為它不是函數引用)。 記住.then(b())將首先執行b() ,然后將其返回值傳遞給.then() 那顯然不是您想要的,也不是.then()設計要使用的。 有關更多信息,請參見下面的Promise規范詳細信息。

方案C:第三個正確地將指向b的函數引用傳遞給.then()處理程序,因此它是唯一正確鏈接了兩個promise的函數。


方案B的Promise規范說明

在第二種情況下,您將像.then(somePromise)一樣將諾言傳遞給.then(somePromise) .then()處理程序。 .then()規范非常清楚地指出,必須向.then()傳遞可調用的內容(這意味着函數引用)。 當您不傳遞函數引用時,傳遞的任何內容都將被忽略,並且先前解析的值(在您的情況下為aaa )將沿着鏈向下傳遞。 這是promise規范涵蓋的內容:

25.4.5.3中 ,有.then .then()的規范。 在此處輸入圖片說明

最后調用PerformPromiseThen() ,這是下一部分25.4.5.3.1

在此處輸入圖片說明

該部分說明,如果onFulFilled參數是不可調用的(例如,不是函數引用),則將替換“ Identify”。

在文檔中進一步查看時, 第25.4.1.2節中定義了“身份”

應該應用於傳入值的函數,其返回值將控制派生的promise發生了什么。 如果[[Handler]]為“ Identity”,則等效於僅返回其第一個參數的函數。

這意味着將忽略作為onFulFilled參數傳遞的任何內容,並忽略一個身份函數(該函數將返回傳遞給它的第一個參數)。 在您的情況下,第一個參數是您的第一個promise的解析值aaa因此這就是您在第二種情況的日志中看到的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM