10

promise を返す関数があり、非同期関数内からそれを待機しようとしています。問題は、プロミスを待つのではなく、プログラムがすぐに完了することです。

async-test.js:

function doItSlow() {
    const deferred = new Promise();

    setTimeout( () => {
        console.log( "resolving" );
        deferred.resolve();
    }, 1000 );

    return deferred;
}

async function waitForIt( done ) {

    console.log( "awaiting" );
    await doItSlow();
    console.log( "awaited" );
    done();
}

waitForIt(() => {
    console.log( "completed test" );
});

console.log( "passed by the test" );

ビルドして実行:

babel --stage 0 --optional runtime async-test.js > at.js && node at.js`

結果:

awaiting
passed by the test

1 秒待つのではなく、すぐに解決しても効果はありません。

function doItSlow() {
    const deferred = new Promise();

    console.log( "resolving" );
    deferred.resolve();

    return deferred;
}

興味深いことに、「解決中」は、現在は同期されていますが、出力されません。

awaiting
passed by the test

コンパイラの問題が疑われますが、Babel の出力を確認したところ、確かに、同期バージョンがコンパイルされました。

非同期関数内からの約束を待つことができると思いました。私がここに欠けているものはありますか?

4

1 に答える 1

8

あなたはPromise正しく使用していません(標準に準拠していると仮定して)。それには方法がありませんresolve。代わりに関数を渡す必要があります。

function doItSlow() {
  return new Promise(resolve => {
    setTimeout( () => {
      console.log( "resolving" );
      resolve();
    }, 1000 );
   }); 
 }
于 2015-06-29T20:46:01.090 に答える