2016-04-20 2 views
1

Ich verstehe, dass Versprechungen es einfacher macht, mit asynchronen Code zu arbeiten, anstatt Callback-Funktionen zu verwenden, aber ich bin nicht so klar über die Vorteile, sie für reinen synchronen Code zu verwenden.Gibt es irgendwelche Vorteile beim Einbinden von synchronem Code in ein JavaScript-Versprechen?

Nehmen wir an, ich habe eine Funktion, die eine teure Berechnung durchführt, die 5 Sekunden dauert (nicht asynchron, nur reine Berechnungen). Da Versprechungen auf dem gleichen Thread wie die einzelne JS Thread ausgeführt wird, gibt es irgendwelche Vorteile zu tun dies:

expensiveFunction() { 
    // expensive function that takes 5 seconds to complete 
} 

expensiveFunction(); 
doSomethingAfterwards(); 

statt dessen:

expensiveFunctionPromise() { 
    return new Promise(function(resolve) { 
    // expensive function that takes 5 seconds to complete 
    resolve(); 
    } 
} 

expensiveFunction().then(doSomethingAfterwards); 

bearbeiten: Ich habe eine jsfiddle dass scheint zwischen den beiden keinen Unterschied zu zeigen:

https://jsfiddle.net/nu1wj681/

die Sync-Version dauert ca. 3 Sekunden pro Schleife für insgesamt 6 Sekunden, während die Versprechen/Async-Version 6 Sekunden pro Schleife dauert, aber die Gesamtzeit beträgt immer noch 6 Sekunden, was bedeutet, dass sie beide parallel laufen, aber auch gleichzeitig Faden.

+2

Nein. Es macht nur Ihren Code kompliziert. Der einzige Grund, warum Sie dies tun sollten, ist, wenn die Funktion _might_ an einem bestimmten Punkt asynchron wird. –

+0

Wenn Sie über teuren synchronen Code verfügen, sollten Sie sich [Web Workers] (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers) ansehen. Die Verwaltung der Web-Mitarbeiter kann ein guter Grund sein, Versprechungen zu verwenden. – JLRishe

Antwort

0

Versprochen sind entworfen, um Ihnen helfen, asynchronen Code zu verwalten und somit - zumindest soweit ich weiß - haben keine Vorteile bei der Verwendung für die synchrone Verarbeitung. Auch das Versprechen selbst ist nicht asynchron und somit wird der Sync-Code innerhalb des Versprechens immer noch sync ausgeführt. In diesem Zusammenhang nimmt auch einen Blick auf dem ersten Satz der „Dokumentation“:

Das Objekt Versprechen für zeitversetztes und asynchrone Berechnungen verwendet wird. Ein Versprechen stellt einen Vorgang dar, der noch nicht abgeschlossen ist, aber zukünftig erwartet wird.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Synchronous Code wird vollständig nur nicht in der Zukunft.

Wenn Sie die "teure Funktion" asynchron und nicht auf dem Hauptthread ausführen möchten, sollten Sie einen Blick auf "Web Worker" werfen. Versprechungen in Kombination mit Web-Mitarbeitern zu nutzen ist eine gute Sache.

Verwandte Themen