2016-08-23 29 views
5

Hàm Javascript này dường như sử dụng vòng lặp while theo cách không đồng bộ. Đây có phải là cách chính xác để sử dụng trong khi các vòng có điều kiện không đồng bộ không?Khi sử dụng vòng lặp Await Async.

var Boo; 
var Foo = await getBar(i) 
while(Foo) { 
    Boo = await getBar3(i) 
    if (Boo) { 
     // something 
    } 
    Foo = await getBar(i) 
    i++ 
    } 

Những gì tôi nghĩ nó là thế này:

var Boo; 
var Foo; 
getBar(i).then((a) => { 
    Foo = a; 
    if(Foo) { 
    getBar3(i).then((a) => { 
     Boo = a 
     if(Boo) { 
     //something 
     i++; 
     getBar(i).then((a} => { Repeat itself...}  
     } 
    } 
    } 
}) 

Nếu đó là hoàn toàn sai sự thật bạn có thể hiển thị một cách khác để làm điều đó với async chờ đợi + trong khi vòng lặp?

Cảm ơn !!

+0

Chỉ cần FYI, không đồng bộ/chờ đợi không phải là một phần của ES 6. –

+0

đang chờ chuyển đổi thành máy trạng thái. Bạn có thể có một số máy trạng thái nhỏ như bạn đã viết (rất khó để giải thích), hoặc bạn có thể có một máy trạng thái lớn hơn (ví dụ như C#). –

+0

Ý bạn là gì theo "cách chính xác"? Nếu mã này làm những gì bạn muốn, thì đó là chính xác. –

Trả lời

8

Đây có phải là cách chính xác để sử dụng trong khi vòng lặp có điều kiện không đồng bộ không?

Có. async function s chỉ cần tạm ngừng thực thi trên mỗi await cho đến khi các lời hứa tương ứng hoàn thành và mọi cấu trúc điều khiển tiếp tục hoạt động như trước đây.

0

Đã một thời gian kể từ khi câu hỏi này được hỏi. Tôi mới đến js sau nhiều năm của các ngôn ngữ khác (bắt đầu với thẻ đục lỗ và băng giấy) và cần thiết để giải quyết vấn đề này. Đây là câu trả lời của tôi:

var loopContinue = true; 
var n = 0; 

async function Managework() { 
    while (loopContinue) { //seemingly an infinite loop 
    //await (doWork(n)); 
    await (doWork(n).catch(() => { loopContinue=false; })); 
    n++; 
    console.log(`loop counter ${n}`); 
    } 
    console.log(`loop exit n=${n} loopContinue=${loopContinue}`); 
} 

Managework(); 

function doWork(n) { 
return new Promise((resolve, reject) => { 
    console.log(`dowork(${n})`); 
    if (n > 5) { 
     //loopContinue = false; 
     reject(`done`); 
    } 
    setTimeout(() => { 
     resolve('ok'); 
    }, 1000); 
    }); 
} 

Khi muốn ngắt vòng lặp sau lần lặp thứ 5. 'loopContinue' toàn cầu có thể được thiết lập trong chức năng làm việc hoặc trong đánh bắt (hoặc có thể là sau đó) của lời hứa. Tôi mệt mỏi chỉ bằng cách sử dụng 'phá vỡ' trong sau đó hoặc bắt nhưng tôi nhận được một lỗi.

Nếu bạn muốn làm điều đó trong doWork bạn có thể loại bỏ các bắt và chỉ cần gọi doWork() và bỏ ghi chú // loopContinue = false trong doWork. Dù bằng cách nào cũng hiệu quả. Điều này đã được thử nghiệm với node.js

Tôi đã tìm thấy nội dung trên nextTick nhưng điều này có vẻ dễ dàng hơn nhiều.

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