javascript - 在 Node.js 中的字典上调用 forEach

标签 javascript json node.js foreach firebase-admin

我正在尝试循环 Firebase 引用。它可以工作,但由于某种原因,forEach 循环比引用中的对象多运行一次。这会导致 Promise.all() 函数失败并且整个 Promise 失败。这是我的代码。我不知道我做错了什么。

return userReceiptMetrics.child(userID).child('postItemIDs').orderByChild('itemID').equalTo(oldProductID).once('value', function(oldSnapshot) {
            var oldPostItemIDs = [];
            var metrics = oldSnapshot.val()

            if (oldSnapshot.val() != null) {
                return Promise.all(oldSnapshot.forEach(function(record) {
                    console.log(record.val());
                    var oldKey = record.key;
                    var newKey = oldKey.replace(oldProductID, newProductID);
                    var data = record.val();
                    oldPostItemIDs.push(oldKey);
                    data.itemID = newProductID;
                    updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+newKey] = data;
                    updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+oldKey] = null;
                })).then(function() {
                    return Promise.all(oldPostItemIDs.map(function(oldPostItemID) {
                        return userReceiptMetrics.child(userID).child('postItems').child(oldPostItemID).then(function(oldPostItem) {
                            var oldKey = oldPostItem.key
                            var newKey = oldKey.replace(oldProductID, newProductID)
                            var data = record.val()                        
                            updateObject['userReceiptMetrics/'+userID+'/postItems/'+newKey] = data;
                            updateObject['userReceiptMetrics/'+userID+'/postItems/'+oldKey] = null;

                            progress(38);
                        });
                    }))
                }).catch(function(error) {
                    console.log('fudge louise');
                });
            }
        });

这是控制台输出:

 App listening on port 8080
Press Ctrl+C to quit.
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "_state" at /productUpdateQueue/tasks to your security rules for better performance 
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "_state" at /productUpdateQueue/tasks to your security rules for better performance 
{ date: '2016-12-21 22:05:03',
  itemID: 'Macys-EReceipts-MENS HOSIERY-Size(No size provided)-Color(No color provided)-786888403743',
  postID: '-KZbmaThvxNmrvHwh_mc' }
{ date: '2016-12-21 22:05:03',
  itemID: 'Macys-EReceipts-MENS HOSIERY-Size(No size provided)-Color(No color provided)-786888403743',
  postID: '-KZbxAUcwzcP28C91EZA' }
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "itemID" at /userReceiptMetrics/HeQST8hSkoPUmkBiVDR0tpSPo0x2/postItemIDs to your security rules for better performance 
fudge louise

最佳答案

看来 Promise.all() 调用失败了,因为对象列表末尾有一个空对象。这是更正后的代码。

return userReceiptMetrics.child(userID).child('postItemIDs').orderByChild('itemID').equalTo(oldProductID).once('value', function(oldSnapshot) {
            var oldPostItemIDs = [];
            var metrics = oldSnapshot.val()

            if (oldSnapshot.val() != null) {
                return Promise.all(oldSnapshot.forEach(function(record) {
                    console.log(record.val());
                    var oldKey = record.key;
                    var newKey = oldKey.replace(oldProductID, newProductID);
                    var data = record.val();
                    oldPostItemIDs.push(oldKey);
                    data.itemID = newProductID;
                    updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+newKey] = data;
                    updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+oldKey] = null;
                })).then(function() {
                    return oldPostItemIDs.map(function(oldPostItemID) {
                        return userReceiptMetrics.child(userID).child('postItems').child(oldPostItemID).then(function(oldPostItem) {
                            var oldKey = oldPostItem.key
                            var newKey = oldKey.replace(oldProductID, newProductID)
                            var data = record.val()                        
                            updateObject['userReceiptMetrics/'+userID+'/postItems/'+newKey] = data;
                            updateObject['userReceiptMetrics/'+userID+'/postItems/'+oldKey] = null;

                            progress(38);
                        });
                    })
                }).catch(function(error) {
                    console.log('fudge louise');
                });
            }
        });

关于javascript - 在 Node.js 中的字典上调用 forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41290926/

相关文章:

json - AngularJS - 从 json 创建对象/模型的动态属性

linux - Raspberry PI Node EventEmitter 内存泄漏

c# - 使用 WPF 客户端和 Active Directory ADFS 对 Cloud NodeJS 后端进行身份验证

javascript - MongoDB _id 作为字符串(MEAN 堆栈)

javascript - 使用javascript删除部分字符串

javascript - 你如何使用 Node 将分块视频上传到推特

javascript - 传递变量: best practice using modules

Javascript函数

javascript - 在 JS/JSON 函数中返回变量

c# - C#中如何获取对象的值