2017-07-18 82 views
4

Mozilla,等待只待承諾:是否等待等待諾言般的對象?

[RV]返回承諾的解析值,或本身的價值,如果它不是一個承諾。

如果您等待非承諾,已解決的承諾將立即返回,並且不會等待。但是,以下代碼正在等待,而不使用Chrome中的Promises & FF。

var obj = { 
    then:func => obj.func=func 
}; 
setTimeout(() => obj.func(57), 1000); 

async function go() { 
    var res = await obj; 
    console.log(res); //shows '57' after 1000ms 
} 

go(); 

根據該規範,應等待等待許狀物體不屬於承諾? (我試過看規格(從Mozilla的文章鏈接),但我無法理解。)

+0

主要問題是什麼承諾爲ES-transpiler /解釋器,其執行等待操作。例如,您可以使用藍鳥承諾,但默認配置下的babel將無法理解它。主要定義之一是'promise === Promise.resolve(promise)',但是編譯時轉譯器無法看到它。 –

+0

在實踐中,最有可能的是,Promise是一些有意思的東西,這意味着再生器運行時的Promise,這被廣泛用於實現。有關詳細信息,請參閱https://babeljs.io/docs/plugins/transform-async-generator-functions/。 –

+0

其實它使用的承諾,你就看不出來:-)順便說一句,這些「承諾狀物體」也被稱爲[* thenables *](https://stackoverflow.com/q/29435262/1048572)。 – Bergi

回答

0

that same page

如果該值不是一個Promise,其轉換價值一個解決Promise,並等待它。

該值將自動轉換爲已解析的Promise,然後等待。

+1

但是在我的例子中,返回了一個未解決的諾言,因爲它等待另外1000毫秒。如果能解決,它會立即返回。那個頁面意味着參數是按照原樣返回的,所以在我的例子中它會返回'{then:func => obj.func = func}',而不是'57' - 請參閱這裏的示例。 – wezten

1

await將觸發obj.then(),這是造成這種行爲。因爲即使obj不是承諾,也是可靠對象

您有關於here的一些信息。

在你的情況下,它的作品,因爲:

第一跳

  1. obj初始化
  2. setTimeout()被執行,其回調將在接下來的蜱
  3. go()聲明被稱爲
  4. go()是執行d
  5. await被觸發內部go(),其執行obj.then(),分配解析功能,以obj.func
  6. 它使蜱在這裏結束

其次剔

  1. 尚未解析setTimeout()回調執行,解決承諾通過obj.func()與價值57

第三蜱

  1. 控制是回go(),結果57記錄
+0

我寫了,所以我明白它爲什麼有效。我的問題是,它是否在規範中說,如果它不是'Promise',或者這是瀏覽器執行的東西不在規範中,'await'應該檢查'then'屬性的對象嗎? – wezten