创建承诺回调
Creating a promise callback
所以我很难弄清楚如何创建一个适用于不同 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]);
也就是说,您确定不需要承诺提供的回调吗?如果使用如中所述的帮助程序函数,则不会收到有关何时/是否收到数据的任何反馈。换句话说,"所以我尝试返回承诺,然后我可以这样做"步骤有什么问题?
- 承诺在非节点式回调上使用Bluebird
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- JQuery 承诺已经包含回调的函数
- JavaScript - 返回承诺和/或调用回调
- 承诺中的成功回调不会发生$http
- 如何重构“;回调金字塔”;转换为基于承诺的版本
- 承诺在Protractor中进行回调排序
- Javascript承诺动态回调
- 编写一个使用传递两个参数的回调的承诺
- Phantom.js-如何使用承诺而不是回调
- 在第一次错误回调时退出承诺链
- 如何获取 Ember 组件对象内部承诺成功或错误回调
- 创建承诺回调
- 回调/承诺无法正常工作
- 通知承诺角度删除回调
- 回调/承诺在快递.js中实现
- Node sequelize回调承诺期望一个函数,是否有一种方法可以通过函数调用删除已声明的函数
- Angular-For Loop HTTP回调/承诺
- 特定于Node-webkit的javascript回调/承诺问题
- 让javascript函数与回调/承诺实现总是返回一个承诺