2017-01-30 11 views
1

node.jsには、Q.all()。then();を実行したいときにPromisesの配列があります。プロセスは、何も起こっていないようです。たぶん私の配列に未解決の約束があり、プロセスをブロックしたのでしょうか?私はここで何をやっているのかは分かりませんが、私の目標は一度にすべての関数を実行することです。次に、完全な "トークン"配列を取得して別のファイルに送ります。
Q.all()で正しく行うにはどうしたらいいですか?
Node.js Q.all()と約束事の配列

var pipo = new Array(); 
var ref_accounts = firebase.database().ref('accounts'); 
geoQuery.on("key_entered", function(lakey, location, distance) { 
    pipo[lakey] = lakey; 
}); 
// I have here my pipo Array full of data 
var promises = []; 
var token = []; 
for (var key in pipo) { 
    var deferred = Q.defer(); 
    var ref = firebase.database().ref("etablissements").orderByKey().equalTo(value).on("child_added", function(snapshot) { 
     var data = snapshot.val(); 
     if ((data.alerte != false) && (data.categorie === categories)) { 
      var ref2 = firebase.database().ref("accounts").orderByKey().equalTo(value).on("child_added", function(snapshot2) { 
       var data2 = snapshot2.val(); 
       if (data2.token != null) { 
        token.push(data2.token); 
        deferred.resolve(data2); 
       } else { 
        deferred.reject(); 
        // or deferred.resolve(); ?? 
       } 
      }); 
     } else { 
      deferred.reject(); 
      // or deferred.resolve(); ?? 
     } 
    }); 
    promises.push(deferred.promise); 
} 

私は私の「約束」私は一度にすべてを実行し、その後

 Q.all(promises).then(function(results) { 
     var uniqueNames = []; 
     for (i = 0; i < token.length; i++) { 
      if (uniqueNames.indexOf(token[i]) === -1) { 
       uniqueNames.push(token[i]); 
       console.log('tokens' + token[i]); 
      } 
     }, 
     // error 
     function(response) { 
      console.log('Error in then' + response); 
     }).catch(function(error) { 
     console.log('CATCH ERROR' + error); 
    }); 
    // Send token array to the API 
    }); 

私は本当に理解していない配列に巻き込まれたすべてのトークンを取得するためにここにしたい完全な配列と今 を持っていますプロセス。このコードで何が間違っているか教えてください。

+1

問題はおそらくforループに関係しています。 'for(var in key in pipo)'の関数ブロックの内容を別の関数に抽出し、それが役立つかどうか確認してください。 (Googleはループのjavascriptで関数を作成しないでください)。代わりにここで 'array.map()'を使うことをお勧めします。 – vincent

+0

出力されるエラーをキャプチャするために.catch()ブロックを追加することから始めたいと思うでしょう。 Q.all()メソッドが呼び出される前に(コードが実際にここに作成されることを確認するために)、.then()の内部でさらにログを取って、実際に解決するかどうかを知る必要があります。最後の手段として、あなたはしたいでしょう let count = 0; promises.forEach(()=> console.log(++ count、 'done')); – Kato

+0

(デューデリジェンスの基本的なデバッグ;すべての出力をチェックし、障害点を特定する) – Kato

答えて

1

私はこれで成功:

var pipo = new Array(); 

は、その後、私は "非同期" を使用し、代わりに "forEachの"

async.map(pipo, function (item,callback) 
{ 
    ... 
}); 

のマップを使用

var pipo = []; 

に置き換えられました@カトのように、エラーは私のpの1つだったロマンスは拒絶される。私はこれでそれをデバッグ:

let count = 0; 
promises.forEach(() => console.log(++count, 'done')); 

そして、最後に、私はQ.allを(使用).then()、最も重要な.catch()方法!これを解決するのを手伝ってくれてありがとう、もう一度ありがとう。

関連する問題