2015-06-17 22 views
5

Come faccio await su async funzione chiamata con call o apply con Babel?attendono su una funzione asincrona chiamata a chiamata o applicare con Babel

seguito un esempio, dove getOrders è un metodo async di una classe Service:

class Service() { 
    async getOrders(arg1, arg2, arg3) { 
     return await this.anotherService.getOrders(arg1, arg2, arg3); 
    } 
} 

let service = new Service(); 
// ... 
// Babel doesn't compile 
// let stream = await service.getOrders.call(this, arg1, arg2, arg3); 
// producing SyntaxError: Unexpected token for await 
let stream = service.getOrders.call(this, arg1, arg2, arg3); 
stream.pipe(res); // obviously not working without await in the prev line 

UPDATE/SOLUZIONE

Il problema era che let stream = service.getOrders.call(this, arg1, arg2, arg3); sia in una funzione anonima all'interno di una funzione regolare. Invece di contrassegnare la funzione anonima async, l'ho fatto per una normale funzione che causa Babel SyntaxError: Unexpected token.

Grazie a @loganfsmyth per avermi condotto alla soluzione.

+0

stai chiedendo cosa fare quando si desidera chiamare una funzione asincrona al di fuori di un'altra funzione asincrona? Non è chiaro cosa questo abbia a che fare con call/apply/bind, o cosa 'questo' stai passando a' call' nella tua domanda. – loganfsmyth

+0

@loganfsmyth no, sto chiedendo come 'attendere 'su una funzione' async' chiamata con 'call' o' apply'. – krl

+0

Si dovrebbe attendere come si fa normalmente. Aggiornato la mia risposta. – loganfsmyth

risposta

4

Un async function restituisce una promessa, e await accetta la promessa. Non è necessario che tutte le funzioni async vengano richiamate tramite attendi. Se si desidera utilizzare una funzione asincrona all'interno di una funzione JS standard, si utilizzerà direttamente la promessa del risultato. Nel tuo caso, chiamando una funzione con .call restituirà ancora una promessa come qualsiasi altra funzione, in modo che ci si passano la promessa di attendere:

async function doThing(){ 
    let service = new Service(); 

    var stream = await service.getOrders.call(this, arg1, arg2, arg3) 
    stream.pipe(res); 
} 
+0

Questo è quello che mi aspetterei, ma 'babel' non sembra supportarlo al momento . – krl

+0

Si prega di fornire un esempio che dimostri questo in Babel, poiché sicuramente dovrebbe funzionare anche lì. Il tuo esempio attuale non usa nemmeno attendere. – loganfsmyth

+0

Poiché 'babel' non compila' lascia stream = attendi service.getOrders.call (this, arg1, arg2, arg3); '. Fornisce 'SyntaxError: Unexpected token' per' await'. – krl

-3

Si può provare un wrapper come questo:

class Service() { 
    async getOrders(arg1, arg2, arg3) { 
    // .... 
    }; 
    wrappedOrders(arg1, arg2, arg3) { 
     let res = await getOrders(arg1, arg2, arg3); 
     return res; 
    } 
} 

e chiamare i wrappedOrders questo modo:

let stream = service.wrappedOrders.call(this, arg1, arg2, arg3); 
+1

Ogni funzione con 'await' è' async', quindi 'wrappedOrders' deve anche' async', che ci riporta alla mia domanda – krl

Problemi correlati