iT邦幫忙

0

請問 JavaScript 的 Promise

'use strict';

let p1 = Promise.resolve('p1-resolve');
let p2 = p1.then(
    () => Promise.resolve('p2-resolve'),
    () => {}
)
.then(
    () => setTimeout(console.log, 0, 'resolve'),
    () => setTimeout(console.log, 0, 'reject')
);

setTimeout(console.log, 0, p1);
setTimeout(console.log, 0, p2);

在 Firefox 主控台顯示:

Promise { <state>: "fulfilled", <value>: "p1-resolve" }
Promise { <state>: "fulfilled", <value>: 4 }
resolve

請問:
我預期 p2 顯示的值是 "p2-resolve",
但為何卻是 4 呢?

1 個回答

1
斯人
iT邦研究生 2 級 ‧ 2021-11-01 18:46:15
最佳解答

因為最後的 then 回傳的是

setTimeout(console.log, 0, 'resolve')

所以那個 4 是 setTimeout 的回傳值 timeoutID
參考setTimeout()#Return value

如果是下面這樣,就會得到你想要的結果

let p1 = Promise.resolve('p1-resolve');
let p2 = p1.then(
    () => {
        setTimeout(console.log, 0, 'resolve')
        return Promise.resolve('p2-resolve');
    },
    () => {}
)

setTimeout(console.log, 0, p1);
setTimeout(console.log, 0, p2);
Promise {<fulfilled>: 'p1-resolve'}
Promise {<fulfilled>: 'p2-resolve'}
resolve
samjam iT邦新手 4 級 ‧ 2021-11-01 19:07:36 檢舉

謝謝您的回答,
可是 p2 應該是第一個 p1.then 回傳的 Promise 實例,
最後的 then 回傳的是另一個新的 Promise 實例,
不是應該每個 then 都會回傳一個新實例嗎?

斯人 iT邦研究生 2 級 ‧ 2021-11-01 19:38:22 檢舉

p1.then 會回傳的 Promise 沒錯,
但這個 Promise(即 p1.then) 又接了一個 then,導致他又去執行一次 then,所以最後回傳的 Promise 是 p1.then.then

samjam iT邦新手 4 級 ‧ 2021-11-01 19:42:51 檢舉

原來 p2 取得的是最後的 then 回傳的實例,
這樣我了解囉,
謝謝您!

我要發表回答

立即登入回答