2015-06-17 21 views
5

Làm cách nào để await trên chức năng async được gọi là call hoặc apply với Babel?Đang chờ trên một chức năng không đồng bộ được gọi với cuộc gọi hoặc áp dụng với Babel

Dưới đây là một ví dụ, nơi getOrders là một phương pháp async của một lớp 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/SOLUTION

Vấn đề là let stream = service.getOrders.call(this, arg1, arg2, arg3); là trong một chức năng ẩn danh bên trong một hàm thông thường. Thay vì đánh dấu chức năng ẩn danh async, tôi đã làm nó cho một chức năng thường xuyên gây ra Babel SyntaxError: Unexpected token.

Nhờ @loganfsmyth đã dẫn tôi đến giải pháp.

+0

Bạn có yêu cầu phải làm gì khi bạn muốn gọi một chức năng async bên ngoài một hàm async khác? Nó không rõ ràng những gì này đã làm với cuộc gọi/áp dụng/ràng buộc, hoặc những gì 'này' bạn đang đi đến' gọi' trong câu hỏi của bạn. – loganfsmyth

+0

@loganfsmyth không, tôi đang hỏi cách 'chờ đợi' trên một hàm 'async' được gọi với 'call' hoặc' apply'. – krl

+0

Bạn muốn sử dụng như bạn thường làm. Đã cập nhật câu trả lời của tôi. – loganfsmyth

Trả lời

4

Một async function trả về một Promise, và await chấp nhận một lời hứa. Không yêu cầu tất cả các chức năng async được gọi qua chờ. Nếu bạn muốn sử dụng hàm async bên trong một hàm JS chuẩn, bạn sẽ trực tiếp sử dụng lời hứa kết quả. Trong trường hợp của bạn, gọi một hàm với .call vẫn sẽ trả về một lời hứa giống như bất kỳ chức năng khác, vì vậy bạn biết họ muốn vượt qua lời hứa đó để chờ đợi:

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

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

Đây là điều tôi mong đợi, nhưng 'babel' dường như không hỗ trợ nó . – krl

+0

Vui lòng cung cấp ví dụ minh họa điều này trong Babel, vì nó chắc chắn sẽ hoạt động ở đó. Ví dụ hiện tại của bạn thậm chí không sử dụng chờ đợi. – loganfsmyth

+0

Vì 'babel' không biên dịch' let stream = await service.getOrders.call (this, arg1, arg2, arg3); '. Cung cấp 'SyntaxError: Mã thông báo không mong đợi' cho' await'. – krl

-3

Bạn có thể thử một wrapper như thế này:

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

và gọi wrappedOrders theo cách này:

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

Mọi chức năng với 'await' là 'async', vì vậy' wrapOrders' cũng phải bằng' async', điều này đưa chúng ta trở lại câu hỏi của mình – krl

Các vấn đề liên quan