2016-06-22 6 views
0

I次のコードを持っている:

function getData(foos, bars) { 
    var generated = {}; 

    return $q(function(resolve, reject) { 

    var promises = _.map(foos, function(foo) { 
     return _.map(bars, function(bar) { 
     return someServiceCall(foo, bar).then(function(data) { 
      _.set(generated[foo.id], player.id.toString() + '.data', data); 
      }); 
     }); 
    }); 

    // Join all promises in to a final resolve 
    $q.all(promises).then(function() { 
     resolve(generated); 
    }, reject); 
    }); 
} 

私は何を達成したいことはすべてsomeServiceCall -sを持つことであり、それは時間resolve(generated)で仕上げ、成功のハンドラが呼び出されます。開発者ツールバーのこのコード部分をデバッグすると、すべての約束に対して成功ハンドラsomeServiceCallが呼び出される前にresolve(generated)が呼び出されます。

注:オブジェクトが参照として渡されるので、これは必ずしも機能を破壊しません。したがって、resolveがすでに呼び出されていてもデータは設定されますが、これらの呼び出しがすべて完了していれば機能はより明確になります。時間解決が呼び出されます。

答えて

3

私はちょっと愚かなミスを感じました。 $q.allは約束の配列を期待しながら

var promises = [[Promise, Promise][Promise, Promise, Promise]]; 

return _.flatMap(bars, function(bar) { 

var promises = [Promise, Promise, Promise, Promise, Promise]; 

を、私は簡単にflatMapによる最初map呼び出しを置き換えることによって、これを解決することができ、2つのネストされたマップは、次のような構造をもたらし

$q.allはまだ静かに約束を解決したnデータ形式が適切でないというエラーまたは警告。

今後この問題に遭遇する人を助けることができれば幸いです。