Firebase Firestore-常见的查询功能,但结果不同

时间:2018-07-12 14:18:52

标签: javascript firebase google-cloud-firestore

我会尽力向自己解释。

我要做的是设置一个通用函数,该函数可以传递集合的名称并对此进行处理。问题在于,由于这是一个异步请求,所以我不能只做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。这可能是重复的,但由于我不知道要搜索什么,所以不能肯定地说

2 个答案:

答案 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) {
...
});