2016-08-03 5 views
-1

私は幾分複雑なシナリオを持っており、Q.allへの私の呼び出しが解決された約束の配列を返していないのはなぜか分かりません。 jQuery $.ajaxコールとQ.コールが混在しています。ここでは、セットアップは次のとおりです。Q.all()は解決された値の配列を返しません

var saveThing1 = function(){ 
    return $.ajax({...}); 
} 
var saveThing2 = function(){ 
    return $ajax({...}); 
} 
var deleteThing2 = function(){ 
    return $.ajax({...}); 
} 

saveThing1.then(function(){ 
    var promiseArr = [saveThing2(), saveThing2(), deleteThing2()]; 
    return Q.all(promiseArr); 
}).then(function(response){ 
    var result1 = response[0]; 
    var result2 = response[1]; 
    var result3 = response[2]; 
}); 

From the Q docs:各約束の履行 値を含む配列で満たされている約束を返し、または

promise.all()

却下される最初の約束である拒絶の理由が同じで拒否されます。

この場合、responseの値は、約束値の配列の代わりに単一のPromiseになります。これは私がデバッガを一時停止し、response値が何であるかログインしたときにクローム開発ツールが生成するものです:

Promise {} 
    inspect:() 
    promiseDispatch:(resolve, op, operands) 
    valueOf:() 
私はまだで私の頭を悩まてるもう一つは、ネットワーク要求がある一方で .thenがヒットしてしまうことです

まだ保留中です。つまり、Q.allに渡された配列の約束が保留中であることを意味します。

+0

あなたの関数を呼び出す必要があります(。例えば、 'saveThing1()then') –

+0

' saveThing1.thenを(返される約束のために) 'は' saveThing1()。then() 'でなければなりません。 – jfriend00

+1

jQuery ajaxの約束は、かわいそうな獣です。彼らは本当に物事を混乱させることがある単一の価値観(完全に非標準的)には解決しません。 – jfriend00

答えて

2

.allは、Promise(またはPromiseのようなオブジェクト)を必要とします。あなたは現在、約束ではなく、関数を渡しています。これが機能するためには、あなたのすべての機能が呼び出される必要があります。

var saveThing1 = function(){ 
    return $.ajax({...}); 
} 
var saveThing2 = function(){ 
    return $ajax({...}); 
} 
var deleteThing2 = function(){ 
    return $.ajax({...}); 
} 

saveThing1().then(function(){ 
    // populate the array with returned promises, not functions that return promises 
    var promiseArr = [saveThing2(), saveThing2(), deleteThing2()]; 
    return Q.all(promiseArr); 
}).then(function(response){ 
    var result1 = response[0]; 
    var result2 = response[1]; 
    var result3 = response[2]; 
}); 
+0

申し訳ありませんが、私のコードで呼び出されています。私はここでそれを一般化して(明らかに)、膨らんでいる/無関係なものを切り取った。私はサンプルコードを更新しました。 – jkinz

関連する問題