NIFCLOUD-mbaas / UserCommunity

ニフクラ mobile backend ユーザーコミュニティ
https://mbaas.nifcloud.com/
82 stars 18 forks source link

二つのクラスからそれぞれの値を取得する方法が知りたい #335

Open tamiya028 opened 8 years ago

tamiya028 commented 8 years ago

NCMBとMonacaで開発を行っています。 以下のようなことがしたいのですが、Query1のforが全て回った後にQuery2が実行されてしまいます… 勉強を初めたばかりでかなりの初心者なのですが、よろしくお願いします。

var Query1 = new NCMB.Query("query1");
var Query2 = new NCMB.Query("query2");
var sample = new Array();

Query1.find({
    success: function(result){
        for(var i=0; i < result.length; i++){
            var data = {

            };

            data.flag = false;
            Query2.find({
                success: function(result){
                    for(var i=0; result.length; i++){
                        if(result[i].get("test") == "aaa"){
                            data.flag = true;
                        }
                    }
                },

                error: function(error){
                    console.log(error);
                }
            });
        }

        sample[i] = data;
    },

    error: function(error){
        console.log(error);
    }
});
goofmint commented 8 years ago

たぶん並列に実行されているからではないでしょうか。Query2.findも実行はされているのですが、Query1.findのforのが速いのでQuery2.findの結果が返る前に終了しているのだと思います。

どういった処理がしたいのでしょうか?

tamiya028 commented 8 years ago

迅速な助言をありがとうございます。 Query1.findのdataにflagを入れたいのですが、Query2.findの条件と一致した時にtrueをdata.flagに入れて、sample[i]に代入するような処理がしたいです。 現状ではconsole.log(sample[i])をすると、{flag: false}, {flag: false}, {flag:false}のようになってしまい、sample[i]にdata.flag = falseが全て入った後にQuery2.findのflagがdataに入ってしまっているようなので、全て回ったあとにdataにはtrueが入ってはいるのですが、sample[i]には入っていないみたいで、 {flag: true}, {flag: false}, {flag: true}のようにしたいです。 説明下手で申し訳ありません…

goofmint commented 8 years ago

なんとなくですが、dataというのを使わないで、sample[i] = {} をQuery1.findのループの中で定義した方が良いかと。でないと次のループになるたびにdataがリセットされてしまいます。

で、data.flag = true としているところを sample[i].flag = true とすれば良いかなと。ただ、この場合でもiが次のループに入ってしまっている可能性が高いので、

function (i) {
  Query2.find({
    :
    sample[i].flag = true;
  });
}(i);

のようにスコープを区切ってあげる必要があるかなと。

JavaScriptの非同期処理は色々と気を遣うので頑張ってください!

tamiya028 commented 8 years ago

スコープを意識することが大切なんですね… moongiftさんのおかげで、何とか実装することができました! ありがとうございました!

goofmint commented 8 years ago

よかった! :+1: