创建一个promise回调

时间:2016-03-13 14:43:48

标签: javascript firebase promise

所以我很难搞清楚如何创建一个适用于不同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时,它返回一个对象,当它显然是一个数组。有人可以详细说明吗?

我有一种感觉,我最终将不得不为将来我将要进行的每个查询手动编写一个承诺,我只是想知道这是否是一种更有效的方法。

1 个答案:

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

那就是说,你确定你不需要承诺提供的回调吗?如果您使用您描述的辅助函数,则不会获得有关何时/何时收到数据的任何反馈。换句话说,出了什么问题?“所以我尝试回复承诺,然后我可以在步骤中执行此操作?