ฉันกำลังพยายามใช้คุณสมบัติใหม่ของ async และฉันหวังว่าการแก้ปัญหาของฉันจะช่วยผู้อื่นในอนาคต นี่คือรหัสของฉันซึ่งใช้งานได้:
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
});
}
ปัญหาคือขณะที่ลูปของฉันทำงานเร็วเกินไปและสคริปต์ส่งคำขอมากเกินไปต่อวินาทีไปยัง google API ดังนั้นฉันต้องการที่จะสร้างฟังก์ชั่นการนอนหลับซึ่งล่าช้าคำขอ ดังนั้นฉันสามารถใช้ฟังก์ชั่นนี้เพื่อชะลอการร้องขออื่น ๆ หากมีวิธีอื่นในการหน่วงเวลาการร้องขอโปรดแจ้งให้เราทราบ
อย่างไรก็ตามนี่คือรหัสใหม่ของฉันซึ่งใช้งานไม่ได้ การตอบสนองของคำขอจะถูกส่งกลับไปยังฟังก์ชัน async แบบไม่ระบุชื่อภายใน setTimeout แต่ฉันไม่รู้ว่าฉันจะคืนการตอบสนองไปยังฟังก์ชัน sleep ได้อย่างไร ไปยังฟังก์ชัน asyncGenerator เริ่มต้น
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);
}
ฉันได้ลองใช้ตัวเลือกแล้ว: การจัดเก็บการตอบสนองในตัวแปรทั่วโลกและส่งคืนจากฟังก์ชั่นสลีป, โทรกลับภายในฟังก์ชั่นที่ไม่ระบุชื่อ ฯลฯ
Promise.all
วิธีการ เรียบง่ายและสง่างาม!