如何在不嵌套回调的情况下确保同步执行?

时间:2015-05-17 02:53:43

标签: javascript asynchronous callback

我有这个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循环。这是为什么?

1 个答案:

答案 0 :(得分:3)

JavaScript是使用单个线程运行的,因此你的while循环会占用大量CPU并基本上冻结所有其他计算。承诺是您可以使用的一种方法(如评论中所述)。您还可以将带有回调的对象传入您的函数。总之,忘记在单线程环境中“休眠”(你的循环正在做)。