我会尽力向自己解释。
我要做的是设置一个通用函数,该函数可以传递集合的名称并对此进行处理。问题在于,由于这是一个异步请求,所以我不能只做var a = getFirestoreData();
,所以我不得不一遍又一遍地使用这段代码:
const db = firebase.firestore();
myCollection = 'SomeRandomCollectionName';
//Repetitive piece of code
db.collection(myCollection).get().then((snapshot) => {
var dataFromCollection = [];
snapshot.docs.forEach(doc => {
dataFromCollection.push(doc.data());
})
//TODO -> Do something with that data.
});
我希望能够对具有相同功能(每次仅一个集合)的不同集合执行不同的操作。
基本上我想要的是类似 Utils 类的东西,例如:
Utils.getUsers("users");
Utils.getUsersAndUpdate("users", fieldToUpdate, dataToInsert);
这两个函数都使用相同的先前代码,但具有不同的连续性。考虑到这是一个异步请求,我该怎么做?
这是我提出的一种解决方案,但是由于每个函数采用的参数数量可能会有所不同,因此无法向targetFunction
添加参数。
function getFromDatabaseToFunction(targetFunction, collection){
db.collection(collection).get().then((snapshot) => {
var dataToTargetFunction = [];
snapshot.docs.forEach(doc => {
dataToTargetFunction.push(doc.data());
})
targetFunction(dataToTargetFunction);
})
}
P.S。这可能是重复的,但由于我不知道要搜索什么,所以不能肯定地说
答案 0 :(得分:1)
在JavaScript中,异步功能的完成或失败由Promise管理。就您而言,您可以简单地从getFromDatabaseToFunction
返回一个承诺,并与then()
链接新动作:
function getFromDatabase(collection){
return db.collection(collection).get().then((snapshot) => {
var result = [];
snapshot.docs.forEach(doc => {
result.push(doc.data());
});
return result;
});
}
这里是使用方法:
var targetFunction = ...;
getFromDatabase("collectionName").then(collectionData => {
// do whatever you want with 'targetFunction' and 'collectionData'
});
答案 1 :(得分:-1)
像这样建立.promise
:
function fetchCollection(collectionPath){
return new Promise(function (resolve, reject) {
var ref = firebase.firestore().collection(collectionPath);
ref.get().then(function(querySnapshot) {
resolve(querySnapshot);
}).catch(function (error) {
reject(error);
});
});
然后按以下方式使用它:
fetchCollection("users").then(function (querySnapshot) {
...
});