如何在不嵌套回调的情况下保证同步执行?
How can I ensure synchronous execution without nesting callbacks?
我有这个 JavaScript 代码,它遍历 indexedDB 对象存储和 returns 它包含的所有对象。
我需要等到该方法完成后才能继续我的代码,因为我需要使用代码将对象推送到的数组变量。
确保同步执行的一种方法是嵌套回调函数。
虽然我没有这样做,但我想我可以只添加一个 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 循环。这是为什么?
JavaScript 是 运行 单线程,所以你的 while 循环会用掉很多 CPU 并且基本上冻结所有其他计算。承诺是您可以使用的一种方法(如评论中所述)。您还可以传入一个带有回调函数的对象。总之,在单线程环境中忘掉 "sleeping"(你的循环正在做的事情)。
我有这个 JavaScript 代码,它遍历 indexedDB 对象存储和 returns 它包含的所有对象。
我需要等到该方法完成后才能继续我的代码,因为我需要使用代码将对象推送到的数组变量。
确保同步执行的一种方法是嵌套回调函数。
虽然我没有这样做,但我想我可以只添加一个 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 循环。这是为什么?
JavaScript 是 运行 单线程,所以你的 while 循环会用掉很多 CPU 并且基本上冻结所有其他计算。承诺是您可以使用的一种方法(如评论中所述)。您还可以传入一个带有回调函数的对象。总之,在单线程环境中忘掉 "sleeping"(你的循环正在做的事情)。