0

私は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のためのクラウド機能でそれにアイテムを追加する方法を知っていますか?

+0

これでうまくいくはずです。 jsonResponseの内容をログに記録して、それがあなたの考えであるかどうかを確認することを試みましたか? –

+0

'computeData'に送信する前に空ですが、' computeData'に追加したprint配列の 'computeData'にログ' jsonResponse'を書きました。これは完璧です。しかし、ここでは 'response.send(jsonResponse);という空の応答を送信します。これは、同じ配列に追加していないことを意味します。これは 'response.send(jsonResponse);'が 'computeDate'の実行前に実行されるためですか? –

+0

期待どおりに動作していないものの完全な最小限の例を示してください。現在、computeDataには欠けている可能性のあるコードがたくさんあります。 –

答えて

1

あなたelse文では、あなたのループが終了し、それはあなたの他の文でcomputeData()になる時間によってresponse.send(jsonResponse);と呼ばれていた意味promiseです。

はこのような何かを試してみてください、それはすべての変数には触れませんが、主なアイデアは、resolvedとして計算値とPromise.allを使用することです -

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("https://stackoverflow.com/users/" + userId)); 
    return geoFire.get("location").then(function(location) { 
    return computeData(); 
    }); 
} 

はそれが理にかなって願っています。

+0

私はこれが問題だと思います。それは他にもある。空の応答を送信します。私はそれをどのように解決できるか知っていますか? –

+0

あなたが提案したとおり、更新されたコードはここで確認できますhttps://pastebin.com/QmTnbFmtこれは '[null、null、null、null、null、null、null、null、null、null、null、null ] '応答で更新されたコードで何が間違っているか確認できます –

+1

' computeData() 'から何も返されていないようですね? – grgmo

関連する問題