所以我很难搞清楚如何创建一个适用于不同firebase查询/不同承诺的函数。
考虑这个承诺,它会将空输出数组转换为查询/保证的返回数据。
//userKeys is an array with my 'queries'
Promise.all(userKeys.map(function(key) {
return database.child(key).once("value") //Returns a promise
})).then(function(respond) {
userData = respond;
});
这完美无缺。所以我想我会为不同的查询创建一个能够做到这一点的函数,那就是我刚刚到达死胡同的地方。
所以我将把我之前的代码包装在一个函数
中function query(keys, array) {
return Promise.all(keys.map(function(key) {
return ref.child(key).once("value")
})).then(function(respond) {
array = respond; //This won't work
return respond;
});
}
所以我尝试回复承诺,然后我可以在
上执行此操作someQuery = query(queryKeys);
someQuery.then(function(data){ //Manual written array to store data here
queryResults = data})
我仍然需要以编程方式将数据存储在数组中,这是我无法弄清楚的。
回过头看我上面的第二段代码(我的函数)第二个参数是我要传递的数组,我选择的数组将填充数据,但是赢得了#39 ;或者工作。如果我更加简化我的功能,我会开始看到奇怪的事情。
output = [];
function modify(arrayName) {
var data = ["1", "2", "3", "4"];
arrayName = data; //Doesnt work
arrayName = data.slice() //Doesnt work
arrayName.push(data) //Works, but I don't want to push I want to copy
}
modify(output); //Output will stay empty
为什么我的输出数组保持空白?这是正常的吗?此外,当我控制日志arrayName时,它返回一个对象,当它显然是一个数组。有人可以详细说明吗?
我有一种感觉,我最终将不得不为将来我将要进行的每个查询手动编写一个承诺,我只是想知道这是否是一种更有效的方法。
答案 0 :(得分:1)
在JavaScript中,任何非原始值都由“引用副本”(more details in this answer)传递。
您可以使用Array#splice()
更新给定数组的内容,例如:
function mutate(arr) { arr.splice(0, arr.length, 1, 2, 3); }
var a = [];
mutate(a);
console.log(a); // [1,2,3]
splice
函数对您的情况有点不方便,因为它期望每个新项目作为单独的参数传递。这可以通过使用Function#apply()
(或现代JS中的spread operator)来解决:
function mutate(dest, src) { dest.splice.apply(dest, [0, dest.length].concat(src)); }
var arr = [1,2,3];
mutate(arr, [6]);
console.log(arr); // [ 6 ]
更简单的方法是将包含数组的对象传递给mutator函数:
var myData = { array: [] };
function mutate(obj, newArray) {
obj.array = newArray;
}
mutate(myData, [1,2,3]);
那就是说,你确定你不需要承诺提供的回调吗?如果您使用您描述的辅助函数,则不会获得有关何时/何时收到数据的任何反馈。换句话说,出了什么问题?“所以我尝试回复承诺,然后我可以在步骤中执行此操作?