2016-03-13 64 views
1

所以我很难搞清楚如何创建一个适用于不同的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}) 

我仍然需要存储数据一个程序化的数组,我无法弄清楚。

所以回头看看我上面的第二段代码(我的函数)第二个参数是我想要传递的一个数组,我的选择数组将填充数据,不管工作。如果我更简化我的功能,我会开始看到奇怪的事情。

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时,它会返回一个对象,当它清楚地显示一个数组时。有人可以详细说明吗?

我有一种感觉,我最终必须为将来每次查询时手动编写一份承诺,我只是想知道这是否是一种更有效的方式。

回答

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]); 

那就是说,你确定你不需要承诺提供的回调吗?如果您使用您描述的帮助功能,您将不会收到有关何时/如果收到数据的任何反馈。换句话说,有什么问题“所以我试着回复承诺,然后我可以在”“步骤上做到这一点?

+0

但是,请不要。这实际上不是承诺如何使用。 –

+0

@MadaraUchiha你指的是答案的第一部分,拼接和应用? – Nickolay

+0

@MadaraUchiha最后一次数据加载后,它将使用angularJS在视图中呈现。那么Nickolay做错了什么?而Nickolay,那是错误的,我必须为每个承诺单独做。我想不出有什么办法可以做到这一点,我知道我不会收到任何反馈,但我不认为我需要它,因为无论如何,只要它加载,我就会将它呈现在我的视图中。 – Abdel