首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在云函数中将数组作为引用从一个函数传递到另一个函数

如何在云函数中将数组作为引用从一个函数传递到另一个函数
EN

Stack Overflow用户
提问于 2017-08-07 03:00:54
回答 1查看 1K关注 0票数 0

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

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

index.js

代码语言:javascript
复制
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中将数组作为引用传递并向其中添加项吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-07 03:55:01

您的else语句是一个promise,这意味着当它到达else语句中的response.send(jsonResponse);时,您的循环已经结束并调用了computeData()

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

代码语言:javascript
复制
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();
  });
}

希望这是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45535544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档