Отправка данных обратно на Android из облачных функций Firebase - PullRequest
0 голосов
/ 21 мая 2018

Я хочу отправить данные обратно через functions.https.onCall, код работает и возвращает данные на консоль, но я не знаю, почему я не могу отправить данные обратно на устройство (в ответ номер один, яЯ не могу понять, почему возвращаемое число 2 не работает из-за асинхронной задачи, поэтому есть способ выполнить ее после ее завершения?).

const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
var posts= new Array();
var finalposts = new Array();
function post (uid,text,user_name,vid,sendtime,vote,tag,pic,lan){
  this.uid=uid;
  this.text=text;
  this.user_name=user_name;
  this.vid=vid;
  this.sendtime=sendtime;
  this.vote=vote;
  this.tag=tag;
  this.pic=pic;
  this.lan=lan;
}

exports.getWarm = functions.https.onCall((data, context) => {
finalposts = [];
posts = [];
db.collection('local uploads/heb/posts').where('vote', '<', 200).where('vote', '>', 100).get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        posts.push( new post(doc.data()["uid"],doc.data()["text"],doc.data()["user_name"],doc.data()["vid"],
          doc.data()["sendtime"],doc.data()["vote"],doc.data()["tag"],doc.data()["pic"],doc.data()["lan"])); 
      });
      posts.sort(function(a,b) {return (a.sendtime<b.sendtime)? 1:((a.sendtime>b.sendtime)? -1:0);});
          for (var i =0; i<data.refresh_num*2; i++) {
      finalposts.push(posts[i]);
    }
    console.log('hey', '=>', finalposts);
    //  working: the posts are shown in the console
// (1.) return { posts: finalposts };
// returns null
    })
    .catch((err) => {
      console.log('Error getting documents', err);
    });
// (2)return { posts: finalposts };
//  returns {posts=[]}
return { posts: 'data' };
//  returns {posts=data}
});

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

ну, это было проще, чем я думал, мне просто нужно было его вернуть.

exports.getWarm = functions.https.onCall((data, context) => {
finalposts = [];
posts = [];
return db.collection('local uploads/heb/posts').where('vote', '<', 200).where('vote', '>', 100).get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        posts.push( new post(doc.data()["uid"],doc.data()["text"],doc.data()["user_name"],doc.data()["vid"],
          doc.data()["sendtime"],doc.data()["vote"],doc.data()["tag"],doc.data()["pic"],doc.data()["lan"])); 
      });
      posts.sort(function(a,b) {return (a.sendtime<b.sendtime)? 1:((a.sendtime>b.sendtime)? -1:0);});
          for (var i =0; i<data.refresh_num*2; i++) {
      finalposts.push(posts[i]);
    }
    console.log('hey', '=>', finalposts);
return { posts: finalposts };
    })
    .catch((err) => {
      console.log('Error getting documents', err);
    });

});
0 голосов
/ 24 мая 2018

Вам необходимо вернуть Promise из вашей функции Firebase, чтобы вернуть данные.Попробуйте добавить return перед вашим db.collection и посмотрите, работает ли он.

Из документов: https://firebase.google.com/docs/functions/callable

Чтобы вернуть данные после асинхронной операции, верните обещание.

РЕДАКТИРОВАТЬ: я не очень знаком с Firebase Firestore, но любые вызовы, которые генерируют обещание, добавить перед ним оператор возврата.

Кроме того, исходя из моего опыта, вы захотите перейтиваш return { posts: 'data' }; для выполнения после вашего последнего обещания с использованием then.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...