私は1つの配列を持っています。私は1つの配列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("https://stackoverflow.com/users/" + request.query.userId));
geoFire.get("location").then(function(location) {
xLocation = location;
});
db
.ref("https://stackoverflow.com/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("https://stackoverflow.com/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("https://stackoverflow.com/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);
}
、誰もが参照として配列を渡すとFirebaseのためのクラウド機能でそれにアイテムを追加する方法を知っていますか?
これでうまくいくはずです。 jsonResponseの内容をログに記録して、それがあなたの考えであるかどうかを確認することを試みましたか? –
'computeData'に送信する前に空ですが、' computeData'に追加したprint配列の 'computeData'にログ' jsonResponse'を書きました。これは完璧です。しかし、ここでは 'response.send(jsonResponse);という空の応答を送信します。これは、同じ配列に追加していないことを意味します。これは 'response.send(jsonResponse);'が 'computeDate'の実行前に実行されるためですか? –
期待どおりに動作していないものの完全な最小限の例を示してください。現在、computeDataには欠けている可能性のあるコードがたくさんあります。 –