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

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"(你的循环正在做的事情)。