javascript - 如何将数组从一个函数传递到另一个函数作为云函数中的引用

标签 javascript node.js firebase google-cloud-functions geofire

我有一个函数getUsers,其中有一个数组jsonResponse。我将该数组传递给computeData函数。我希望computeData函数应该能够在jsonResponse数组本身中添加项目。

但是下面的代码没有添加到同一个数组中,因为它总是在 response.send 函数中返回空数组。

index.js

exports.getUsers = functions.https.onRequest((request, response) => {
  var x = [];

  var xLocation,
    yLocation = [],
    jsonResponse = [];

  // print algorithm name
  console.log(request.query.algo);

  let geoFire = new GeoFire(db.ref("/users/" + request.query.userId));

  geoFire.get("location").then(function(location) {
    xLocation = location;
  });

  db
    .ref("/users/" + request.query.userId)
    .once("value")
    .then(function(snapshot) {
      var jsonObject = snapshot.val();
      var basicProfileJsonObject = jsonObject.basicProfile;
      for (var key in basicProfileJsonObject) {
        if (utils.isNumber(basicProfileJsonObject[key])) {
          x.push(basicProfileJsonObject[key]);
        }
      }
      db.ref("/users/").once("value").then(function(snapshot) {
        var y = [];
        snapshot.forEach(function(item) {
          var user = item.val();
          let userId = user.basicProfile.userId;
          if (userId !== request.query.userId) {
            if (xLocation == null) {
              computeData(x, user, request.query.algo, jsonResponse);
            } else {
              let geoFire = new GeoFire(db.ref("/users/" + userId));
              geoFire.get("location").then(function(location) {
                if (location === null) {
                  console.log(
                    "Provided key is not in GeoFire, will ignore profile"
                  );
                  computeData(x, user, request.query.algo, jsonResponse);
                } else {
                  console.log("Provided key has a location of " + location);
                  var distance = GeoFire.distance(xLocation, location); // in km
                  console.log("Distance: " + distance);

                  if (distance < 15) {
                    computeData(x, user, request.query.algo, jsonResponse);
                  }
                }
              });
            }
          }
        });
        response.send(jsonResponse);
      });
    });
});

function computeData(x, user, algo, jsonResponse) {
  var similarityCount,
    y = [];

  var basicProfileJsonObject = user.basicProfile;
  for (var key in basicProfileJsonObject) {
    if (utils.isNumber(basicProfileJsonObject[key])) {
      y.push(basicProfileJsonObject[key]);
    }
  }

  if (algo === "cosine") {
    // compute cosine value
    similarityCount = cosineUtils.cosineSimilarity(x, y);
  } else if (algo == "euclidean") {
    // compute euclidean distance value
    similarityCount = 1 / (1 + euclidean(x, y));
  } else if (algo === "pearson-correlation") {
    // compute pearson correlation coefficents
    similarityCount = pcorr.pearsonCorrelation(x, y);
  }
  console.log(x);
  console.log(y);
  console.log(similarityCount);
  jsonResponse.push(user);
}

有谁知道如何在 Cloud Function for Firebase 中传递数组作为引用并向其中添加项目?

最佳答案

您的else语句是一个promise,这意味着您的循环将在它完成时完成并调用response.send(jsonResponse);获取 else 语句中的 computeData()

尝试这样的方法,它不会触及所有变量,但主要思想是使用 Promise.all 并将计算值作为 resolved -

exports.getUsers = functions.https.onRequest((request, response) => {
  // blah blah
  var y = []; // store promises that resolves your computed value
  snapshot.forEach(function(item) {
    // blah blah
    if (xLocation == null) {
      y.push(Promise.resolve(computeData());
    } else {
      y.push(computeAnotherData(userId));
    }
  });

  Promise.all(y)
    .then(values => {
      response.send(values);
    });
});

function computeAnotherData(userId) {
  let geoFire = new GeoFire(db.ref("/users/" + userId));
  return geoFire.get("location").then(function(location) {
    return computeData();
  });
}

希望这是有道理的。

关于javascript - 如何将数组从一个函数传递到另一个函数作为云函数中的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535544/

相关文章:

javascript - Number.prototype.toLocaleString ('en-US' ) 去掉小数点后万位?

firebase - 如何使用 flutter 从 firebase 获取下载 URL?

ios - 安装 firebase 后生成推送通知

java - Firebase onDisconnect() 不工作

javascript - 如何从函数中多次产生值(value)?

javascript - "simple math syntax"到 MathML 转换器

javascript - 使用 javascript 动态添加和删除 div

node.js - 位置写入现有文件 [Linux、NodeJS]

javascript - 如何通过nodejs将文本转换为JSON?

javascript - 尝试从本地主机 :4200 to http://localhost:3333 代理请求/api/书籍时出现 Angular HPM 本地主机错误