JavaScript Promise 绕过解析并继续执行 .then()

标签 javascript firebase asynchronous firebase-realtime-database promise

我在嵌套 Promise 方面遇到了一些问题,导致了忘记 Promise 问题。

let promiseList = new Promise((resolve, reject) => {
    //first query to retrieve from firebase
        query.once( 'value', data => {
            var promises = [];

            data.forEach(snapshot => {
                //get item key

                //second query based on item key                                    
                var promise = query.once('value');
                promises.push(promise);

                promise.then(data => { 
                    var itemDetail = data.val();

                    var receiptID = itemDetail.receiptID;
                    // third query to find matching receiptID
                    var query = firebase.database().ref('receipts');
                    query.once('value', data => {   
                        data.forEach(snapshot => {

                            snapshot.forEach(childSnapshot => {
                                if(childSnapshot.key == receiptID){
                                    var branchDetail = childSnapshot.val().branch;
                                    var branchName = branchDetail.branchName;

                                    //console.log('inside promise ' + branchName);
                                    datasetarr.push({branchName: branchName});
                                }
                            });

                        });
                    }); 

                });
            }); 

            // wait till all promises are finished then resolve the result array
            Promise.all(promises).then(() => resolve(datasetarr)); 
        });             
    });

// print out array here
promiseList.then((arr) => {
for(var i = 0; i < arr.length; i++){
    console.log(arr[i].branchName);
}   
});

我设法用“inside Promise”从 console.log 打印出数据。但是,当我尝试从 .then() 打印它时,没有显示任何内容。

现在的问题是,在我解决 promise 之前,它实际上首先运行了 .then() 。

有什么想法吗?

最佳答案

我从未使用过 Firebase,但我确实知道 Promise。 检查此示例链接 promise ,注意生成链接的 return 语句。

var outerPromise = query.once('value').then(data => {
    // Promise array to group 2nd level promises and then do a Promise.all.
    var promises = [];
    // This will be the main output of the outerPromise.
    // We will populate it asynchronously inside our 2nd level promises.
    var datasetarr = [];
    data.forEach(snapshot => {
        // 2nd level promises, will be appended to the promises array.    
        // and will be enchained with the 3d level promise.
        var promise = query.once('value').then(data => { 
            var itemDetail = data.val();
            var receiptID = itemDetail.receiptID;
            var query = firebase.database().ref('receipts');
            // Third level promise. It's enchained by the return statement.
            return query.once('value').then(data => {   
                data.forEach(snapshot => {
                    snapshot.forEach(childSnapshot => {
                        if(childSnapshot.key == receiptID){
                            var branchDetail = childSnapshot.val().branch;
                            var branchName = branchDetail.branchName;

                            //console.log('inside promise ' + branchName);
                            datasetarr.push({branchName: branchName});
                        }
                    });
                });
            }); 
        });
        promises.push(promise);
    }); 

    // We wait until 2nd (and third) level promises are ready
    // and the return our desired output, the datasetarr
    return Promise.all(promises).then(()=> datasetarr);
});             

// Since it's all chained, the outerPromise will resolve once all promises are completed
// and we can get the output we supplied in the last chaining.
outerPromise.then((arr) => {
    console.log(arr)  
});

关于JavaScript Promise 绕过解析并继续执行 .then(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439758/

相关文章:

javascript - 在标签浏览器上为新标签设置焦点

java - Android 推送通知 Firebase

java - Android应用程序标签切换崩溃

android - FirebaseInstanceIdService 不会被调用

javascript - 异步编程的新手。如何让不同对象按正确顺序发生事情?

ios - 数组 append 不适用于 Swift

javascript - 如果不是 promise ,如何等待值返回

javascript - 如何在 FireFox 中聚焦 IFRAME?

javascript - 如何向 vscode 添加新文件类型

javascript - 淡入/淡出的简单切换不适用于过渡、不透明度和可见性