2017-07-18 4 views
4

、唯一待つが約束待っ:約束のようなオブジェクトを待っていますか? <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await" rel="nofollow noreferrer">Mozilla</a>によると

[RV]を、それは約束ではない場合の約束、または値そのものの解決された値を返します。

あなたが非約束を待っている場合、解決された約束はすぐに返され、それは待たないでしょう。ただし、Chromeで約束& 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/interpretatorための約束何ですが、ログに記録されます操作。たとえば、ブルーバードの約束を使うことができますが、デフォルトの設定ではそれを理解できません。主な定義の1つは 'promise === Promise.resolve(promise)'ですが、transpilerはコンパイル時にそれを見ることができません。 –

+0

ほとんどの場合、実際にはPromiseはいくつかのことですが、これは広く一般的に使われているregenerator-runtimeのPromiseを意味します。詳細については、https://babeljs.io/docs/plugins/transform-async-generator-functions/を参照してください。 –

+0

実際にそれは約束を使用しますが、あなたはそれを見ません:-) Btw、それらの "約束のようなオブジェクト"は[* thenables *](https://stackoverflow.com/q/29435262/1048572)とも呼ばれます。 – Bergi

答えて

0

that same pageから:

値がPromiseない場合には、それが値を変換します解決済みPromiseを返し、それを待ちます。

したがって、値は自動的に解決されたPromiseに変換され、次に待機されます。

+1

しかし私の例では、別の1000msを待っているので、未解決の約束が返されます。それが解決されるとすぐに復帰するでしょう。そのページが意味するのは、パラメータがそのまま返されるということです。私の例では、 '{then:func => obj.func = func}'は '57 'ではなく戻ります。 – wezten

1

awaitは、obj.then()をトリガーすることになり、その動作が原因です。 objがプロミスではない場合でも、対象オブジェクトです。

あなたはそのことについていくつかの情報がありますhere

ので、あなたのケースでは、それは動作します:まず、ダニ

  1. obj
  2. setTimeout()初期化され

    が実行され、そのコールバックは

  3. go()が宣言され、次のティックで呼び出されます
  4. go()が実行されています。 D
  5. awaitはダニがここ

第ティック

  1. 終了するように、それはまだ解決されていないobj.func
  2. に解決機能を割り当てる、obj.then()を実行する、go()内部トリガされますsetTimeout()コールバックが実行され、約束をの値を持つobj.func()で解決する

サードダニ

  1. 制御が戻っgo()にあり、その結果57がのawait行い
+0

私はそれを書いたので、なぜそれが動作するのか理解しています。私の質問は、 'await'は、' promise'でない場合、 'then'プロパティのオブジェクトを調べるべきかどうか、または仕様書にないブラウザが実装したものですという仕様です。 – wezten

関連する問題

 関連する問題