Ich habe hier bei stackoverflow einige Fragen zu diesem Thema gelesen, aber keine davon scheint meine Zweifel zu beantworten.
Ich weiß, wie asynchrone Funktionen mit process.nextTick erstellt werden:
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
Ich habe auch über Promise gelesen, aber wie schreibt man asynchrone nicht blockierende Funktionen? ohne Bibliotheken wie process, Promise usw. zu verwenden?
Was ist der native Weg? Ich dachte zuerst über diesen Ansatz nach:
var async = function(val, cb) {
cb(val);
}
Diese Funktionsblöcke:
async(3, function(val) {
console.log(val);
});
console.log(4);
// returns:
3
4
Was ist die richtige Implementierung? Wie könnte ich asynchrone Funktionen schreiben, ohne von diesen Bibliotheken abhängig zu sein?
3 Antworten
In Node.js müssen Sie process.nextTick
verwenden. Im Browser können Sie den postMessage
- Hack verwenden, der viel effizienter ist als setTimeout(function(){},0)
.
Hier ist eine browserübergreifende Implementierung des postMessage
- Hacks: https : //github.com/timoxley/next-tick/blob/master/index.js
Sie können setTimeout
verwenden - es ist eine native Funktion wie eine Verzögerung.
Teilen Sie die Arbeit Ihrer Funktion in Blöcke auf und verwenden Sie process.nextTick
, um den nächsten Block in die Warteschlange zu stellen sobald der aktuelle abgeschlossen ist. Auf diese Weise können andere Rückrufe in der Warteschlange zwischen den einzelnen Arbeitsblöcken ausgeführt werden. Wenn alle Chunks abgeschlossen sind, rufen Sie den Rückruf auf, der als Parameter an Ihre Funktion übergeben wurde.
Das oben Gesagte setzt voraus, dass Ihre Funktion keine vorhandenen asynchronen APIs aufruft, wodurch Ihre Funktion natürlich asynchron wird, ohne etwas Besonderes zu tun.