Tôi đang cố gắng sử dụng async/await nhưng tôi nghĩ rằng tôi đang hiểu nhầm điều gì đó nghiêm túc.Sử dụng async/await để lấy dữ liệu từ một cuộc gọi lại và trả lại giá trị chỉ sau khi lời hứa được giải quyết
Về cơ bản nhất có thể, tôi đang cố gắng tính toán khoảng cách giữa danh sách vị trí và một vị trí được chỉ định bằng cách sử dụng bản đồ google api.
Dưới đây là một ví dụ thô về những gì tôi đang cố gắng để làm: https://jsfiddle.net/qu5y69rj/1/
Bạn có thể thấy rằng kết quả của chức năng đó là undefined
3 lần thay vì những gì tôi mong đợi đó sẽ là {distance: "ZERO_RESULTS"}
cho mỗi cuộc gọi trong trường hợp của ví dụ giả tạo của tôi.
getDistance = async (start, end) => {
const origin = new google.maps.LatLng(start[0], start[1]);
const final = new google.maps.LatLng(end[0], end[1]);
const service = new google.maps.DistanceMatrixService();
let result; //need to return this value!
await service.getDistanceMatrix(
{
origins: [origin],
destinations: [final],
travelMode: 'DRIVING'
}, (response, status) => {
if(status === 'OK') result = {distance: response.rows[0].elements[0].status}
}
)
return result;
}
Tại sao kết quả được trả lại trước khi lời hứa được giải quyết? Làm thế nào tôi có thể trả lại giá trị của result
chỉ sau khi lời hứa đó được giải quyết? Đó là sự hiểu biết của tôi rằng bằng cách nói với javascript để chờ đợi, tôi đang nói không di chuyển về phía trước cho đến khi lời hứa này đã được giải quyết. Điều đó có đúng không? Tôi khá bối rối và điều này khiến tôi kéo tóc ra. Bất kỳ trợ giúp được đánh giá cao.
async/chờ đợi chỉ kết thúc tốt đẹp hứa hẹn. Tôi không thấy lời hứa nào trong đoạn mã này. Có phải 'service.getDistanceMatrix' là mã của bạn không? Bạn có thể làm cho nó trở lại một lời hứa chứ không phải là một cuộc gọi lại? –
không có nó là một phần của bản đồ google api vì vậy nó là những gì nó là –
Bạn không thể 'chờ đợi' một chức năng không đồng bộ kiểu gọi lại. Trước tiên, bạn nên tìm hiểu [cách sử dụng lời hứa] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) trước khi cố gắng giải quyết ['async'/'await'] (https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function). –