Tôi đang cố gắng sử dụng các tính năng async mới và tôi hy vọng việc giải quyết vấn đề của mình sẽ giúp ích cho những người khác trong tương lai. Đây là mã của tôi đang hoạt động:
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await listFiles(nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
Vấn đề là, vòng lặp while của tôi chạy quá nhanh và tập lệnh gửi quá nhiều yêu cầu mỗi giây đến API của google. Vì vậy, tôi muốn xây dựng một chức năng ngủ làm trì hoãn yêu cầu. Do đó tôi cũng có thể sử dụng chức năng này để trì hoãn các yêu cầu khác. Nếu có một cách khác để trì hoãn yêu cầu, xin vui lòng cho tôi biết.
Dù sao, đây là mã mới của tôi không hoạt động. Phản hồi của yêu cầu được trả về hàm async ẩn danh trong setTimeout, nhưng tôi không biết làm thế nào tôi có thể trả lại phản hồi cho chức năng ngủ. đến chức năng asyncGenerator ban đầu.
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await sleep(listFiles, nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
async function sleep(fn, par) {
return await setTimeout(async function() {
await fn(par);
}, 3000, fn, par);
}
Tôi đã thử một số tùy chọn: lưu trữ phản hồi trong một biến toàn cục và trả về từ hàm ngủ, gọi lại trong hàm ẩn danh, v.v.
Promise.all
cách tiếp cận. Thật đơn giản và thanh lịch!