创建承诺回调

Creating a promise callback

本文关键字:回调 承诺 创建      更新时间:2023-09-26

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

为什么我的输出数组保持为空?这正常吗?此外,当我控制台日志数组名称时,它返回一个对象,当它显然是一个数组时。有人可以详细说明吗?

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

在 JavaScript 中,任何非原始值都由"引用副本"传递(本答案中有更多详细信息)。

您可以使用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 运算符)来解决:

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 ]

一种更简单的方法是将一个包含数组的对象传递给您的突变器函数:

var myData = { array: [] };
function mutate(obj, newArray) {
  obj.array = newArray;
}
mutate(myData, [1,2,3]);

也就是说,您确定不需要承诺提供的回调吗?如果使用如中所述的帮助程序函数,则不会收到有关何时/是否收到数据的任何反馈。换句话说,"所以我尝试返回承诺,然后我可以这样做"步骤有什么问题?