Heim  >  Artikel  >  Web-Frontend  >  So erhalten Sie den Rückgabewert einer asynchronen JavaScript-Funktion

So erhalten Sie den Rückgabewert einer asynchronen JavaScript-Funktion

怪我咯
怪我咯Original
2017-03-29 16:09:322893Durchsuche

Beschäftigen Sie sich heute mit einer kleinen Frage: Wie erhalte ich den Rückgabewert der JavaScriptasynchronen-Funktion?

1. Falsche Versuche

Mein erster Versuch, als ich nicht in die Branche eingestiegen bin:

<script>
function getSomething() {
 var r = 0;
 setTimeout(function() {
 r = 2;
 }, 10);
 return r;
}

function compute() {
 var x = getSomething();
 alert(x * 2);
}
compute();
</script>


2.Rückruffunktion

Was angezeigt wird, ist nicht 4, sondern 0. Später fand ich heraus, dass dies ein asynchrones Problem ist,

muss Callback-Technologie verwenden:

<script>
function getSomething(cb) {
 var r = 0;
 setTimeout(function() {
 r = 2;
 cb(r);
 }, 10);
}

function compute(x) {
 alert(x * 2);
}
getSomething(compute);
</script>



3.promise

Die Callback-Funktion ist wirklich eine gute Sache, und das habe ich auch getan Ich schreibe schon lange solchen Code. Übergeben Sie die Funktion, wenn Sie auf asynchron stoßen! ! Später erfuhr ich, dass es eine Sache namens Promise gibt, die speziell Probleme löst, die durch Callback-Funktionen verursacht werden. Ich habe auch etwas über Promise gelernt:

<script>
function getSomething() {
 var r = 0;
 return new Promise(function(resolve) {
 setTimeout(function() {
  r = 2;
  resolve(r);
 }, 10);
 });
}

function compute(x) {
 alert(x * 2);
}
getSomething().then(compute);
</script>



Promise gibt immer noch nicht Wenn Sie den Rückruf starten, wird nur zurückgerufen. Der Standort hat sich geändert.

4.generator

Später erfuhr ich etwas über den Generator und wusste, dass er die Funktionsausführung unterbrechen kann, also machte ich einen neuen Versuch:

<script>
function getSomething() {
 var r = 0;
 setTimeout(function() {
 r = 2;
 it.next(r);
 }, 10);
}

function *compute(it) {
 var x = yield getSomething();
 alert(x * 2);
}
var it = compute();
it.next();
</script>


Die synchrone Schreibmethode kann asynchrone Logik realisieren, die sich viel fortgeschrittener anfühlt.

5. Versprechen + Generator

Später habe ich gehört, dass Versprechen plus Generator die perfekte Möglichkeit ist, Flugabwehrkanonen asynchron zum Töten von Mücken einzusetzen (dieses Beispiel reicht nicht aus). Nennen Sie die Vorteile der gemeinsamen Verwendung der beiden):

<script>
function getSomething() {
 var r = 0;
 return new Promise(function(resolve) {
 setTimeout(function() {
  r = 2;
  resolve(r);
 }, 10);
 });
}

function *compute() {
 var x = yield getSomething();
 alert(x * 2);
}
var it = compute();
it.next().value.then(function(value) {
 it.next(value);
});
</script>



6.async

Ich dachte, das reicht aus. Ja, Später hörte ich, dass es7 die ultimative Lösung bot: asynchron.

Als junger Mann, der gerne lernt, dachte ich, dass ich nicht zurückgelassen werden darf:

<script>
function getSomething() {
 var r = 0;
 return new Promise(function(resolve) {
 setTimeout(function() {
  r = 2;
  resolve(r);
 }, 10);
 });
}

async function compute() {
 var x = await getSomething();
 alert(x * 2);
}
compute();
</script>


Hier atmete ich endlich auf.

Postscript:

Alle oben genannten Beispiele können auf dem neuesten Chrome ausgeführt werden.

Das obige ist der detaillierte Inhalt vonSo erhalten Sie den Rückgabewert einer asynchronen JavaScript-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn