鍍金池/ 問答/HTML/ 關(guān)于promise的一道面試題

關(guān)于promise的一道面試題

Promise.resolve(1)
  .then(2)
  .then(Promise.resolve(3))
  .then(console.log)

運(yùn)行結(jié)果:

   1

解釋:.then 或者 .catch 的參數(shù)期望是函數(shù),傳入非函數(shù)則會(huì)發(fā)生值穿透。

Promise.resolve(1)
  .then(function(){return 2})
  .then(Promise.resolve(3))
  .then(console.log)

結(jié)果為2

Promise.resolve(1)
  .then(function(){return 2})
  .then(function(){return Promise.resolve(3)})
  .then(console.log)

結(jié)果為3

不是太明白,then里面必須通過函數(shù)來返回的一個(gè)值才能被包裝為Promise嗎?

回答
編輯回答
情殺

Promise.resolve(1)沒什么實(shí)用價(jià)值。
Promise主要是解決異步callback寫法不合適的問題,then里面的函數(shù)就是callback的函數(shù),比如ajax的回掉函數(shù)。

2018年4月9日 05:28
編輯回答
舊顏

Promise在ES6之前其實(shí)是個(gè)非標(biāo)準(zhǔn)協(xié)議,據(jù)說最早1976年就有人提出,強(qiáng)調(diào)的是Future的狀態(tài)。在將來如果滿足了特定的條件做什么動(dòng)作(onFulfilled),不滿足做什么動(dòng)作(onRejected)。promise.then(onFulfilled, onRejected)。這樣可能稍微好理解一點(diǎn)。回到你的問題

then里面必須通過函數(shù)來返回的一個(gè)值才能被包裝為Promise嗎?

你這個(gè)問題問的方式就不太對(duì),then只是約定接受一個(gè)function作為它的參數(shù),這個(gè)function返回什么,它并不關(guān)心,你可以不返回,只要promise滿足你的特點(diǎn)條件,就會(huì)回調(diào)你的then。當(dāng)然,你的then又約定了下一個(gè)then的滿足條件。只要過程不出錯(cuò),return之后或者程序執(zhí)行完就會(huì)回調(diào)下一個(gè)then的onFulfilled,return的結(jié)果作為下一個(gè)onFulfilled的參數(shù)。
好拗口。建議你看看Promise的原理。

2017年3月17日 15:46
編輯回答
浪蕩不羈

Promise方法鏈通過return傳值,沒有return就只是相互獨(dú)立的任務(wù)而已

2017年5月11日 21:24
編輯回答
涼薄

參考MDN這段話:https://developer.mozilla.org...

  • 如果then中的回調(diào)函數(shù)返回一個(gè)值,那么then返回的Promise將會(huì)成為接受狀態(tài),并且將返回的值作為接受狀態(tài)的回調(diào)函數(shù)的參數(shù)值。

  • 如果then中的回調(diào)函數(shù)拋出一個(gè)錯(cuò)誤,那么then返回的Promise將會(huì)成為拒絕狀態(tài),并且將拋出的錯(cuò)誤作為拒絕狀態(tài)的回調(diào)函數(shù)的參數(shù)值。

  • 如果then中的回調(diào)函數(shù)返回一個(gè)已經(jīng)是接受狀態(tài)的Promise,那么then返回的Promise也會(huì)成為接受狀態(tài),并且將那個(gè)Promise的接受狀態(tài)的回調(diào)函數(shù)的參數(shù)值作為該被返回的Promise的接受狀態(tài)回調(diào)函數(shù)的參數(shù)值。

  • 如果then中的回調(diào)函數(shù)返回一個(gè)已經(jīng)是拒絕狀態(tài)的Promise,那么then返回的Promise也會(huì)成為拒絕狀態(tài),并且將那個(gè)Promise的拒絕狀態(tài)的回調(diào)函數(shù)的參數(shù)值作為該被返回的Promise的拒絕狀態(tài)回調(diào)函數(shù)的參數(shù)值。

  • 如果then中的回調(diào)函數(shù)返回一個(gè)未定狀態(tài)(pending)的Promise,那么then返回Promise的狀態(tài)也是未定的,并且它的終態(tài)與那個(gè)Promise的終態(tài)相同;同時(shí),它變?yōu)榻K態(tài)時(shí)調(diào)用的回調(diào)函數(shù)參數(shù)與那個(gè)Promise變?yōu)榻K態(tài)時(shí)的回調(diào)函數(shù)的參數(shù)是相同的

2018年3月23日 14:55