本文介绍了Vue和Firebase问题:错误:函数崩溃超出请求范围函数调用被中断的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经看到了这个问题,但是没有很好的答案.我可以理解问题所在,但似乎找不到解决方法.这是我的功能:

I have seen this question asked, but with no good answer. I can understand what the issue is, but can't seem to find out how to remedy it. Here is my function:

//set JSON content type and CORS headers for the response
response.header('Content-Type','application/json');
response.header('Access-Control-Allow-Origin', '*');
response.header('Access-Control-Allow-Headers', '*');

//respond to CORS preflight requests
if (request.method == 'OPTIONS') {
response.status(204).send('');
}

// pull in firebase
var firebase = require('firebase');

require("firebase/firestore");

let config = {
  // config stuff here
}

if (!firebase.apps.length) {
firebase.initializeApp(config);
}

// grab doc id from request
var id = request.query.docId;

// declare connection to firestore
var db = firebase.firestore();

// grab user from request
var docRef = db.collection("clients").doc(id);

// grab the users server and id
docRef.get().then(function(doc) {

// grab the account id
var accountId = doc.data().accountId;

// declare master variable that will be returned
var toReturn = [];

// declare variables that will be returned in toReturn
var gpmGames = [];
var cspmGames = [];
var damageGames = [];
var damageToChampionsGames = [];
var damageTakenGames = [];
var wardsGames = [];

db.collection('games')
  .where('accountId', '==', accountId)
  .get()
  .then((res) => {
    var games = res.docs;
    // iterate through games and get averages and totals to return
    games.forEach(function(game) {

      gpmGames.push(game.data().gpm);
      cspmGames.push(game.data().cspm);
      damageGames.push(game.data().damage);
      damageToChampionsGames.push(game.data().damagetochampions);
      damageTakenGames.push(game.data().damagerecieved);
      wardsGames.push(game.data().wards);

    });
  });

  toReturn['gpmGames'] = gpmGames;
  toReturn['cspmGames'] = cspmGames;
  toReturn['damageGames'] = damageGames;
  toReturn['damageToChampionsGames'] = damageToChampionsGames;
  toReturn['damageTakenGames'] = damageTakenGames;
  toReturn['wardsGames'] = wardsGames;

response.status(200).send(toReturn);
});

因此,我知道在所有操作完成之前都会调用我的纳税申报单.我该如何解决?当然,我的返回值是一个空数组,并且从firebase中得到了错误:错误:函数崩溃超出了请求范围函数调用被中断.

So I understand that my return is being called before everything is done running. How can I fix that? Of course, my return is giving an empty array and I get the error from firebase: Error: function crashed out of request scope Function invocation was interrupted.

谢谢!

推荐答案

您必须使用从此返回的承诺:

You have to use the promise that's returned from this:

db.collection('games')
  .where('accountId', '==', accountId)
  .get()

这是一个异步调用,它会立即返回并带有一个承诺,当工作完成时,该承诺将被解决.

This is an asynchronous call, and it returns immediately with a promise that becomes resolved when the work is complete.

您需要使用该承诺在正确的时间发送响应:

You need to use that promise to send the response at the right time:

const proimise = db.collection('games')
  .where('accountId', '==', accountId)
  .get()

promise.then(snapshot => {
    // work with the document snapshot here, and send your response
})
.catch(error => {
    // deal with any errors if necessary.
    response.status(500).send(error)
})

您发送响应的方式似乎不错,您只需要等待提取完成即可.

The way you're sending the response seems OK, you just need to wait till the fetch is done.

这篇关于Vue和Firebase问题:错误:函数崩溃超出请求范围函数调用被中断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 04:38