我有这个JavaScript代码,它遍历一个indexedDB对象存储并返回它包含的所有对象。
我需要等到方法完成后再继续使用我的代码,因为我需要使用代码将对象推送到的数组变量。
确保同步执行的一种方法是嵌套回调函数。
而不是这样做,我想我可以添加一个while循环,它无限地迭代到方法的结尾,并在我需要的变量被填充时中断。
function getAllObjects(){
var tags=[];
var openRequest = indexedDB.open("Tags",CURRENT_DB_VERSION);
openRequest.onsuccess = function(event){
var db = event.target.result;
var objectStore = db.transaction("domains").objectStore("domains");
objectStore.openCursor().onsuccess= function(event){
var cursor= event.target.result;
if(cursor){
console.log(cursor.value);
tags.push(cursor.value);
cursor.continue();
}
}
db.onerror = function(event){
console.log("an error bubbled up during a transaction.");
};
};
openRequest.onerror = function(event){
console.log("error opening DB");
};
while(tags.length==0){//wait for async to finish
}
return tags;
}
当我这样做时,我的代码永远不会退出while循环。这是为什么?
答案 0 :(得分:3)
JavaScript是使用单个线程运行的,因此你的while循环会占用大量CPU并基本上冻结所有其他计算。承诺是您可以使用的一种方法(如评论中所述)。您还可以将带有回调的对象传入您的函数。总之,忘记在单线程环境中“休眠”(你的循环正在做)。