Saya mencoba menggunakan fitur async baru dan saya berharap menyelesaikan masalah saya akan membantu orang lain di masa depan. Ini adalah kode saya yang berfungsi:
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
});
}
Masalahnya adalah, bahwa loop sementara saya berjalan terlalu cepat dan script mengirim terlalu banyak permintaan per detik ke Google API. Oleh karena itu saya ingin membangun fungsi tidur yang menunda permintaan. Jadi saya juga bisa menggunakan fungsi ini untuk menunda permintaan lainnya. Jika ada cara lain untuk menunda permintaan, harap beri tahu saya.
Bagaimanapun, ini adalah kode baru saya yang tidak berfungsi. Respons permintaan dikembalikan ke fungsi async anonim dalam setTimeout, tetapi saya tidak tahu bagaimana saya bisa mengembalikan respons ke resp fungsi tidur. ke fungsi asyncGenerator awal.
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);
}
Saya sudah mencoba beberapa opsi: menyimpan respons dalam variabel global dan mengembalikannya dari fungsi tidur, panggilan balik dalam fungsi anonim, dll.
sumber
Promise.all
pendekatannya. Sangat sederhana dan elegan!var [parents]
diwakili oleh notasi ? Saya belum pernah melihatnya sebelumnya dan ini adalah hal yang sulit untuk googleasync function
.async
/await
yang didasarkan pada janji-janji. Satu-satunya yang diganti adalahthen
panggilan.Sejak Node 7.6 , Anda dapat menggabungkan fungsi
promisify
fungsi dari modul utils dengansetTimeout()
.Node.js
Javascript
Pemakaian
sumber
await require('util').promisify(setTimeout)(3000)
juga dapat dicapai tanpa memerlukan oleh:await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000)
getOwnPropertySymbols
versi ... jika tidak rusak ...!Satu garis cepat, cara sejajar
sumber
let sleep = ms => new Promise( r => setTimeout(r, ms));
// fungsi satu linerawait new Promise(resolve => setTimeout(resolve, 5000))
setTimeout
bukanasync
fungsi, jadi Anda tidak dapat menggunakannya dengan ES7 async-tunggu. Tetapi Anda bisa mengimplementasikansleep
fungsi Anda menggunakan ES6 Promise :Maka Anda akan dapat menggunakan
sleep
fungsi baru ini dengan ES7 async-tunggu:Harap perhatikan bahwa saya hanya menjawab pertanyaan Anda tentang menggabungkan ES7 async / menunggu dengan
setTimeout
, meskipun mungkin tidak membantu menyelesaikan masalah Anda dengan mengirimkan terlalu banyak permintaan per detik.Pembaruan: Versi node.js modern memiliki implementasi batas waktu async buid-in, dapat diakses melalui utilitas helper.
sumber
fn
melempar kesalahan tidak akan tertangkap.new Promise
mana Anda bisasleep.catch
.setTimeout
callback asinkron dannew Promise
callback telah dilakukan sejak lama. Ini akan menggelembung ke konteks global dan dibuang sebagai pengecualian yang tidak ditangani.Jika Anda ingin menggunakan jenis sintaksis yang sama seperti
setTimeout
Anda dapat menulis fungsi pembantu seperti ini:Anda kemudian dapat menyebutnya seperti ini:
Saya membuat intisari: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
sumber
delayRun
akan lebih masuk akal di sini, karena itu akan menunda jalannya fungsi panggil balik oleh X detik. Bukan contoh yang sangat menunggu, IMO.sumber
Kode berikut berfungsi di Chrome dan Firefox dan mungkin browser lainnya.
Tetapi di Internet Explorer saya mendapatkan Kesalahan Sintaks untuk
"(resolve **=>** setTimeout..."
sumber
Membuat util terinspirasi dari Dave 's jawaban
Pada dasarnya diteruskan dalam
done
panggilan balik untuk menelepon ketika operasi selesai.Ini adalah bagaimana saya menggunakannya:
sumber
Ini adalah versi saya dengan nodejs sekarang pada tahun 2020 di lab AWS
sumber
Ini adalah perbaikan yang lebih cepat dalam satu-liner.
Semoga ini bisa membantu.
sumber
await setTimeout(()=>{console.log('first')}, 200); console.log ('second')
mencetak detik kemudian pertamavar test = async () => { await setTimeout(()=>{console.log('first')}, 1000); console.log ('second') }
Saya telah memperpanjang batas waktu untuk menunjukkan kegunaannya.