2017-02-27 23 views
10

Tôi nhận được biên dịch lỗi thời gian với mã này:Async/chờ đợi bên trong mảng # map()

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue); 
     } 
    }); 
}; 

Thông báo lỗi là:

await is a reserved word

Tại sao tôi không thể sử dụng nó như thế này ?

Tôi cũng đã cố gắng một cách khác, nhưng nó mang lại cho tôi cùng một lỗi:

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     const myNewValue = await service.getByValue(myValue); 
     return { 
      id: "my_id", 
      myValue: myNewValue 
     } 
    }); 
}; 
+1

Tôi không nghĩ bạn có thể có chức năng mũi tên không đồng bộ. – Pointy

+0

Có liên quan https://github.com/tc39/ecmascript-asyncawait/issues/7 –

+1

Để tóm tắt từ cuộc thảo luận github được liên kết, bạn không thể thực hiện điều đó vì hàm ẩn danh bạn đang truy cập dưới dạng gọi lại không phải là 'async' và bên trong "chờ đợi" không thể ảnh hưởng đến chức năng bên ngoài. –

Trả lời

20

Bạn không thể làm điều này như bạn tưởng tượng, bởi vì bạn không thể sử dụng await nếu nó không phải là trực tiếp bên trong một chức năng async.

Điều hợp lý để làm ở đây là làm cho hàm được chuyển thành map không đồng bộ. Điều này có nghĩa là map sẽ trả về một loạt các lời hứa. Sau đó chúng tôi có thể sử dụng Promise.all để nhận kết quả khi tất cả các lời hứa trở lại. Vì chính bản thân số Promise.all trả về một lời hứa, chức năng bên ngoài không cần phải là async.

const someFunction = (myArray) => { 
    const promises = myArray.map(async (myValue) => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
    return Promise.all(promises); 
} 
+0

trong trường hợp này, mảng hứa hẹn sẽ không chậm hơn mà cổ điển cho phép trong mảng? – stackdave

+0

@stackdave Có lẽ, nhưng sự khác biệt sẽ không quan trọng bên cạnh 'service.getByValue', có thể liên quan đến cuộc gọi mạng ... – lonesomeday

+0

cảm ơn tôi đã bắt đầu sử dụng nó, dù sao đọc được tốt hơn vận tốc, bởi vì hầu hết các kỹ thuật async ES6 luôn luôn sẽ chậm hơn, nhưng ai quan tâm – stackdave

4

Tôi tin rằng đó là bởi vì các chức năng trong map không phải là async, vì vậy bạn không thể có chờ trong nó return return. Nó biên dịch với sửa đổi này:

const someFunction = async (myArray) => { 
    return myArray.map(async (myValue) => { // <-- note the `async` on this line 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
}; 

Try it out in Babel REPL

Vì vậy ... nó không thể cung cấp cho giới thiệu mà không nhìn thấy phần còn lại của ứng dụng của bạn, nhưng tùy thuộc vào những gì bạn đang cố gắng để làm, hoặc làm cho nội chức năng không đồng bộ hoặc cố gắng tìm ra một số kiến ​​trúc khác nhau cho khối này.

Cập nhật: chúng tôi có thể nhận được cấp cao nhất đang chờ đợi một ngày nào đó: https://github.com/MylesBorins/proposal-top-level-await

+0

cảm ơn, đã bỏ phiếu, nhưng mảng trả về mã của bạn với các đối tượng trống (tức là '[{}, {}]'). Tôi nghĩ rằng tôi cần phải bao gồm một nơi nào đó "chờ đợi", nhưng không thể nhận ra nơi – MyTitle

+0

Chức năng 'service.getByValue' trông như thế nào? – helb

+0

nó chỉ trả về ES6 Promise – MyTitle

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