2016-10-17 2 views
4
let val = 0; 

async function first() { 
    console.log('1a', val); 
    second(); 
    console.log('1b', val); 
} 

async function second() { 
    console.log('2a', val); 
    third(); 
    console.log('2b', val); 
} 

async function third() { 
    console.log('3a', val); 
    val = await new Promise(function (resolve, reject) { 
     setTimeout(function() { 
      resolve(3); 
     }, 1000); 
    }); 
    console.log('3b', val); 
} 

console.log('0a', val); 
first(); 
console.log('0b', val); 

Ich erwarte:Asynchrone Funktionen verketten?

0a 0 
1a 0 
2a 0 
3a 0 
3b 3 
2b 3 
1b 3 
0b 3 

Aber ich erhalte:

0a 0 
1a 0 
2a 0 
3a 0 
2b 0 
1b 0 
0b 0 
3b 3 

Ich vermute, es eine grundlegende Sache über async ist, die ich nicht bewusst bin?

+2

Nur 'third' ist' await'ing das Ergebnis eines Versprechens, alle anderen Funktionen synchron ausführen. Es sei denn, Sie erwarten zuerst und zweitens, sie werden sofort zurückkehren. – deceze

+0

Nun, ich weiß nicht viel über 'erwarten' und' async', aber der Timeout-Teil erlaubt grundsätzlich den Rest des Codes zu beenden, während der 'wartet' wartet, bis die Zeitüberschreitung beendet ist. (oder genauer gesagt, um das 'Versprechen' zu beenden) – musefan

+0

Warte, welche Version von nodejs unterstützt diese Syntax sogar? Ich habe mit v6.8.1 versucht und es wirft einen Syntaxfehler. – freakish

Antwort

2

Sie

async function first() { 
    console.log('1a', val); 
    await second(); 
// ^^^^^ 
    console.log('1b', val); 
} 

async function second() { 
    console.log('2a', val); 
    await third(); 
// ^^^^^ 
    console.log('2b', val); 
} 

zur Kette der b Protokolle nach der asynchronen Ausführung der aufgerufenen Funktionen verwenden müssen.

Und es ist das gleiche für

console.log('0a', val); 
first(); 
console.log('0b', val); 

nur, dass Sie nicht await hier verwenden können, da Sie nicht innerhalb eines aync function sind. Eine Funktion zu machen async bedeutet nicht, dass es magisch auf alles asynchrone darin blockiert, im Gegenteil - sein Ergebnis wird ein Versprechen, das immer asynchron ist, und Sie können das await Schlüsselwort verwenden. So 0b Wartezeit zu machen, können Sie entweder

console.log('0a', val); 
first().then(function() { 
    console.log('0b', val); 
}, function(err) { 
    console.error(err); 
}); 

oder

(async function() { 
    try { 
     console.log('0a', val); 
     first(); 
     console.log('0b', val); 
    } catch(err) { 
     console.log(err); 
    } 
}()); 
4

Sie werden zur await haben alle Asynchron-Funktion aufruft:

async function first() { 
    console.log('1a', val); 
    await second(); 
    console.log('1b', val); 
} 

async function second() { 
    console.log('2a', val); 
    await third(); 
    console.log('2b', val); 
} 
+1

Das grundlegende Ding, das ich vergaß, war, dass das async ein Versprechen zurückbringt. –

Verwandte Themen