簡體   English   中英

Promise 的兩個怪異行為

[英]two weird behavior of Promise

我發現自己對ES6 Promise缺乏了解。

我有兩個問題

問題 1)

// clear

var _o = null

var m = () => {
    return new Promise(k => {
        _o = k
    })
}

m().then(r => {console.log(r+1000)})

_o(100)

// 1100

正如你在上面看到的,當_o用它的值調用時,promise 解析,我們可以記錄這個值(感謝 .then)

所以上面的例子看起來很清楚。

但這是一個我無法完全理解的例子。

// weird 

var _o = null

var test = () => {
    return new Promise(res => {
        _o = res
    })
}

test();

var p = _o(100)

console.log(p) // undefined

p怎么可能是未定義的?

根據承諾 mdn 文檔

Promise.resolve() 方法返回一個使用給定值解析的 Promise 對象。

我認為p必須解決 Promise 對象。

問題2)

Promise.resolve(10).then(r => console.log(r))  // 10


var p = Promise.resolve

p(10).then(r => console.log(r))

// Uncaught TypeError: PromiseResolve called on non-object

為什么p(10)會引發錯誤?

我已經參考了這篇文章,但還是沒能完全理解。

在此先感謝您的幫助!

p怎么可能是未定義的?

您似乎假設Promise.resolve (您引用的)與傳遞給Promise構造函數回調的函數相同。 他們是不一樣的:

 new Promise(resolve => { console.log(Promise.resolve === resolve); })

實際上,規范定義了傳入的函數返回undefined25.6.1.3.2 Promise Resolve Functions

你可以認為Promise.resolve相當於

Promise.resolve = function (value) {
  return new Promise(resolve => resolve(value));
}

為什么 p(10) 會引發錯誤?

這只是部分與Promise相關。 這通常是由於如何this函數內的工作。 關於Promise.resolve的規范

resolve函數期望它的this值是一個支持 Promise 構造函數的參數約定的構造函數。

如果您將函數調用為p(...)那么thisundefined

如果函數被調用為Promise.resolve(...)那么它的this值將引用Promise

內置函數期望它們的this值是特定類型的對象/值的情況並不少見。

暫無
暫無

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

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