2016-08-10 45 views
9

Tôi có mã ES7 như thế này.Điều gì sẽ xảy ra với 'chờ đợi' khi biểu thức sau từ khóa không đánh giá để hứa hẹn?

async function returnsfive() { 
    var three = 3; 
    var threeP = await three; 
    return threeP+2; 
} 

returnsfive().then(k=>console.log(k), e=>console.error("err", e)) 

Điều gì sẽ xảy ra tại đường dây var threeP = await three?

Mã có nên tiếp tục như mong đợi hay không, vì three không phải là lời hứa?

Trong this repo, nó được đề cập là "Cú pháp có thể tranh luận & ngữ nghĩa". Tôi không thể đọc qua tài liệu chính thức để tìm định nghĩa chính xác, vì nó quá kỹ thuật.

Nhật ký chuyển đổi babel.js mặc định 5 như mong đợi; tuy nhiên, nodent - một biến đổi khác - in TypeError: three.then is not a function. Đó là chính xác và tại sao?

+2

'không đồng bộ/chờ đợi' không thuộc ES7. Đó là một đề xuất. –

+0

Ồ. Cảm ơn bạn đã chỉnh sửa thẻ! –

Trả lời

5

Theo current working draft spec, thời gian chạy nên "diễn viên" giá trị chờ đợi một lời hứa đầu tiên:

AsyncFunctionAwait (giá trị)

  1. Hãy asyncContext là chạy bối cảnh thực hiện .
  2. Hãy để promiseCapability! NewPromiseCapability(%Promise%).
  3. Hãy để resolveResult! Call(promiseCapability.[[Resolve]], undefined, value).
  4. ...

Bước 2 và 3 kết hợp là tương đương với gọi Promise.resolve(value), mà tạo ra một lời hứa mới được giải quyết với các giá trị nhất định hoặc - nếu giá trị là một thenable - sẽ theo đó có thể xảy ra.

Nói cách khác: await 3 tương đương với await Promise.resolve(3) và Babel triển khai thông số chính xác.

gật đầu mặt khác deliberately does not support awaiting a non-promise by default. Có sẵn tùy chọn wrapAwait nếu bạn muốn tất cả các giá trị được chờ đợi được bao bọc trong lời hứa trước, nhưng tài liệu gật đầu báo cáo rằng điều này có thể ảnh hưởng đến hiệu suất.

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