2016-10-25 8 views
1

私はいくつかのサーバーの呼び出しを行う機能を持っている:

function doCalls(options) { 
    var deferred = $q.defer; 
    myService.doCallOne(options).then(function(response){ 
     myService.doCallTwo().then(function() { 
      deferred.resolve(); 
     }); 
    }); 
    return deferred.promise; 
} 

は、私は別のオプションの配列を持っていると私は$q.allに渡す約束の配列を作成したいので、私はこれを実行します。

var promiseArray = []; 
_.each(optionArray, function(options) { 
    promiseArray.push(doCalls(options)); 
}); 

は、その後、私はそれらを解決するのを待つしよう:

$q.all(promiseArray).then(function() { 
    doNextPart(); 
}); 

問題があり、doNextPart()は、任意の前に呼び出さなっているようです私の約束が解決する。私はここで間違って何かをしていますか?

+1

を使用し、 '$ q.defer'があるべき' $のq.defer() ' –

答えて

3

をお忘れの場合は、$q.deferと発声し、実際には延期を作成しませんでした。 doCallsファンクションコールはundefineddeferred.resolve()コールは例外をスローされました(約束により飲み込まれました)、そして$q.allがすぐにundefinedの配列で返されました。

あなたは

var deferred = $q.defer(); 
//      ^^ 

にコードを変更することができますが、本当にあなたはdeferred antipatternを避ける必要があります!ただ、

function doCalls(options) { 
    return myService.doCallOne(options).then(function(response){ 
     return myService.doCallTwo(); 
    }).then(function(secondResponse) { 
     return undefined; // you might want to omit this 
    }); 
} 
+0

D'ああ。うんそれがそれでした。今は彼女が働くので、私はその反パターンを取り除くでしょう! – opticon

+0

これがフォローアップの場所であるかどうかはわかりませんが、コールで発生する可能性のあるサーバーエラーを処理するにはどうすればよいですか。つまりその好みのパターンを使って約束を拒否するには? – opticon

+0

'then'コールバックの中に' throw'することができます(例外は捕捉され、約束はそれと共に拒否されます)、または 'then'コールバックから拒絶された約束を'返す 'ことができます(' $ q.reject(newエラー(...)) ')。 – Bergi

関連する問題