2017-10-30 12 views
0

を使用して、同期実行させます。どのような約束は、私がここにブログの記事、次の午前ジェネレータ

は、私はそれが悪い習慣を知っている - 私たちは今のようにのみ同期javascript関数の戻り値を理解している(正確にはUrweb)フレームワークのようにGWTを使用しています。その記事

{ 
    'use strict'; 

    let asyncTask =() => 
    new Promise(resolve => { 
     let delay = 1000; 

     setTimeout(function() { 
     resolve(delay); 
     }, delay); 
    }); 

    let makeMeLookSync = fn => { 
    let iterator = fn(); 
    let loop = result => { 
     !result.done && result.value.then(res => 
     loop(iterator.next(res))); 
    }; 

    loop(iterator.next()); 
    }; 

    console.log(1); 

    makeMeLookSync(function*() { 
    let result = yield asyncTask(); 

    console.log(result); 
    }); 

    console.log(3); 
} 

から取ら

次のコードは、次のような出力が得られます。 1 3 1000

しかし、約束が同期行われた場合、出力がされている必要があります

1 1000 3

私はそれを間違っているのですか?あるいは、発電機を使って約束を同期させることはできないのですか?

+1

記事は間違っています。それは、それは(不可能である)、同期約束をしない 'then'を使用せずに、シーケンシャル(「同期」)の方法であなたの書き込み非同期のコードをすることができます。 Btw、現代のJで 'async' /' await'を使って同じ好都合な構文を得ます。 – Bergi

答えて

1

私はそれが間違っているのだろうか?

はい。 は同期のように見えるはずですすべてのコードは、ジェネレータ関数の内部で行かなければならないでしょう:

makeMeLookSync(function*() { 
    let result = yield asyncTask(); 

    console.log(result); 
    console.log(3); 
}); 

それとも発電機を使用して約束の同期を行うことが可能ではないでしょうか?

を非同期コード同期にすることができます。

をできるだけ簡単に言えば:ジェネレータを使用すると、は意味同期を、見える(そしてあなたがするリンク先の記事で言及されている)、コードが上から下に実行されることというコードを書くことができます:非同期JavaScriptは、上から下へ読むときに実行されません。

しかし、私は上記のようにのみ発生装置の内部で動作します。 yieldキーワードを使用すると、コードを同期的に書き込むことができます。関数の名前はmakeMeLookSync、ないmakeMeSyncであることに注意してください。


ES2017は、基本的には発電機なしで同じことをしているasync functionsを導入し、と言ったと発電機を実行するための走者た:

{ 
 
    'use strict'; 
 

 
    let asyncTask =() => 
 
    new Promise(resolve => { 
 
     let delay = 1000; 
 

 
     setTimeout(function() { 
 
     resolve(delay); 
 
     }, delay); 
 
    }); 
 

 

 
    console.log(1); 
 

 
    (async function() { 
 
    let result = await asyncTask(); 
 
    console.log(result); 
 
    console.log(3); 
 
    }()); 
 
}

関連する問題