Di sini saya mencoba untuk membungkus kepala saya di sekitar promise. Di sini, pada permintaan pertama saya mengambil satu set tautan. Dan pada permintaan berikutnya saya mengambil konten tautan pertama. Tetapi saya ingin membuat penundaan sebelum mengembalikan objek promise berikutnya. Jadi saya menggunakan setTimeout padanya Tapi itu memberi saya kesalahan JSON berikut ( without setTimeout() it works just fine
)
SyntaxError: JSON.parse: karakter yang tidak diharapkan pada baris 1 kolom 1 dari data JSON
saya ingin tahu mengapa gagal?
let globalObj={};
function getLinks(url){
return new Promise(function(resolve,reject){
let http = new XMLHttpRequest();
http.onreadystatechange = function(){
if(http.readyState == 4){
if(http.status == 200){
resolve(http.response);
}else{
reject(new Error());
}
}
}
http.open("GET",url,true);
http.send();
});
}
getLinks('links.txt').then(function(links){
let all_links = (JSON.parse(links));
globalObj=all_links;
return getLinks(globalObj["one"]+".txt");
}).then(function(topic){
writeToBody(topic);
setTimeout(function(){
return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
},1000);
});
javascript
json
promise
AL-zami
sumber
sumber
return
adalah fungsi khusus, dan hanya mengembalikan ke fungsi induk, dan Anda tidak dapat kembali dari metode asinkron.globalObj
.JSON.parse
melempar? Saya merasa sulit untuk percaya bahwa apakah ada panggilan baliksetTimeout
dalam satuthen
mempengaruhi panggilan di panggilanthen
balik sebelumnya .Jawaban:
Untuk menjaga agar rantai janji tetap berjalan, Anda tidak dapat menggunakan
setTimeout()
cara yang Anda lakukan karena Anda tidak mengembalikan janji dari.then()
pawang - Anda mengembalikannya darisetTimeout()
panggilan balik yang tidak berguna bagi Anda.Sebagai gantinya, Anda dapat membuat fungsi penundaan kecil sederhana seperti ini:
Dan, kemudian gunakan seperti ini:
Di sini Anda mengembalikan janji dari
.then()
pawang dan dengan demikian dirantai dengan tepat.Anda juga dapat menambahkan metode penundaan ke objek Promise lalu langsung menggunakan
.delay(x)
metode pada promise Anda seperti ini:Atau, gunakan pustaka janji Bluebird yang sudah memiliki
.delay()
metode bawaan.sumber
delay()
mengembalikan janji yang akan diselesaikan setelahsetTimeout()
.v
adalah nilai opsional yang ingin Anda selesaikan dengan janji penundaan dan dengan demikian meneruskan rantai janji.resolve.bind(null, v)
berada di tempatfunction() {resolve(v);}
Baik akan bekerja.MEMPERBARUI:
ketika saya perlu tidur dalam fungsi async saya berikan
sumber
Versi ES6 yang lebih pendek dari jawabannya:
Dan kemudian Anda dapat melakukan:
sumber
reject
opsi, misalnya untuk validasi eslint, makaconst delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
Jika Anda berada di dalam blok .then () dan Anda ingin mengeksekusi settimeout ()
output akan seperti yang ditunjukkan di bawah ini
Selamat Coding!
sumber
Di node.js Anda juga dapat melakukan hal berikut:
sumber
util
sedang di-polyfill secara tidak benar. Apakah Anda menggunakan bundler atau sesuatu?