2015-06-17 19 views
5

Jak można ustawić await na async z call lub apply z Babel?Oczekiwanie na funkcję asynchronizującą wywołaną z wywołaniem lub zastosowanie z Babel

Poniżej jest przykład, gdzie jest asyncgetOrders metoda klasy 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/ROZWIĄZANIE

Problem polegał na tym, że let stream = service.getOrders.call(this, arg1, arg2, arg3); była anonimową funkcję wewnątrz regularnej funkcji. Zamiast oznaczać anonimową funkcję async, zrobiłem to dla zwykłej funkcji powodującej Babel SyntaxError: Unexpected token.

Dzięki @loganfsmyth za doprowadzenie mnie do rozwiązania.

+0

Pytasz co zrobić, gdy chcesz wywołać funkcję transmisji asynchronicznej poza inną funkcją asynchroniczną? Nie jest jasne, co to ma wspólnego z call/apply/bind, lub czym "to" przechodzisz do 'call' w swoim pytaniu. – loganfsmyth

+0

@loganfsmyth nie, pytam, jak "poczekać" na funkcję 'async' wywoływaną przez' call' lub 'apply'. – krl

+0

Używałbyś czekania tak jak zwykle. Zaktualizowałem moją odpowiedź. – loganfsmyth

Odpowiedz

4

async function zwraca Promise i await akceptuje obietnicę. Nie ma wymogu, aby wszystkie funkcje async były wywoływane za pomocą czekania. Jeśli chcesz użyć funkcji asynchronicznej w standardowej funkcji JS, skorzystasz bezpośrednio z obietnicy wyników. W twoim przypadku, wywołanie funkcji z .call będzie jeszcze powrócić obietnicę jak każdej innej funkcji, więc oni przekazać tę obietnicę czekają:

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

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

Tego właśnie oczekiwałbym, ale 'babel' nie obsługuje go obecnie . – krl

+0

Podaj przykład, który pokazuje to w Babelu, ponieważ zdecydowanie powinno tam również działać. Twój obecny przykład nawet nie czeka na Ciebie. – loganfsmyth

+0

Ponieważ 'babel' nie kompiluje' let stream = czekaj service.getOrders.call (this, arg1, arg2, arg3); '. Daje 'SyntaxError: nieoczekiwany token' dla' await'. – krl

-3

Można spróbować owijkę tak:

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

i wywołać wrappedOrders ten sposób:

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

Każda funkcja z 'await' to' async', więc 'wrappedOrders' również musi być przez' async' również, co przenosi nas z powrotem na moje pytanie – krl