2017-10-30 1 views
0

verfolge ich den Blog-Artikel hier: http://www.tivix.com/blog/making-promises-in-a-synchronous-mannerWie Versprechen synchron Generatoren machen execute

die besagt, dass Generatoren verwendet werden könnte Versprechen Ausführung zu synchronisieren.

Ich weiß, es ist eine schlechte Praxis - wir verwenden ein GWT-ähnliches Framework (Urweb, um genau zu sein), das ab jetzt nur synchrone JavaScript-Funktion Rückgabewerte versteht.

folgenden Code aus diesem Artikel entnommen

{ 
    '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); 
} 

gibt die folgende Ausgabe: 1 3 1000

Aber wenn das Versprechen synchron gemacht wurde, hätte der Ausgang gewesen

1 1000 3

Mache ich es falsch? Oder ist es nicht möglich, das Versprechen synchron mit Generatoren zu machen?

+1

Der Artikel ist falsch. Es erlaubt Ihnen, asynchronen Code in einer sequentiellen ("synchronen") Weise zu schreiben, ohne 'then' zu verwenden, es macht keine Versprechen synchron (was unmöglich ist). Btw, Sie erhalten die gleiche vorteilhafte Syntax mit 'async' /' erwarten' in modernen Js. – Bergi

Antwort

1

Mache ich es falsch?

Ja. Der gesamte Code, der synchron zu sein scheinen sollte müsste innerhalb der Generatorfunktion gehen:

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

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

Oder ist es nicht möglich, das Versprechen synchron mit Generatoren zu machen?

Sie können niemals synchronen asynchronen Code machen. Generatoren ermöglichen es Ihnen, Code zu schreiben, dass synchron aussieht, was bedeutet (und die im Artikel erwähnt wird Ihnen verbunden), dass der Code von oben nach unten ausgeführt wird:

Um es so einfach wie möglich zu setzen: Asynchrones JavaScript wird beim Lesen nicht ausgeführt - von oben nach unten.

Aber das funktioniert nur innerhalb des Generators, wie ich oben erwähnt habe. Mit dem Schlüsselwort yield können Sie den Code synchron schreiben. Beachten Sie, dass der Name der Funktion makeMeLookSync ist, nicht makeMeSync.


Having said that, ES2017 async functions eingeführt, die im Grunde das Gleiche tun, ohne Generatoren und einen Läufer die Generatoren auszuführen:

{ 
 
    '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); 
 
    }()); 
 
}

Verwandte Themen