2013-07-25 54 views
0

運行道場1.8.4道場JsonRest承諾 - 異步調用順序

使用JsonRest(不是JsonRestStore),我做一個PUT請求到終點,並得到結果返回,並從收集位置信息請求響應如下:

var promise = myJsonRest.put(data).then(function(){ 
    // act when put completes successfully 
    promise.ioArgs.xhr.getResponseHeader('location'); 
}); 

直到最近,這工作沒有問題。然後我開始看到一個TypeError,其中承諾不再包含ioArgs(不能讀取未定義的屬性xhr)。

斷點,並通過堆疊步進指出,ioArgs正在創建並返回,但它履行諾言不是我then(function() { promise.ioArgs /* etc... */ });

,我發現改變我上面的代碼這個問題的解決...

var promise = myJsonRest.put(data); 
promise.then(function(){ 
    // act when put completes successfully 
    promise.ioArgs.xhr.getResponseHeader('location'); 
}); 

...它工作正常,但我不能證明爲什麼。

這不可能是myJsonRest.put()指定的承諾與myJsonRest.put().then()評估的對象不同。我現在唯一的理論是,JsonRest在它自己的異步時間,增加了在put()請求和我的處理程序之間的承諾。由於ioArgs不承諾承諾,它到達我的函數時會丟失。將我的行爲(then())分配給承諾後觸發的承諾必須將我的行爲首先放在要解決的承諾棧上。

任何洞察力是讚賞。

回答

1

這不可能是由myJsonRest.put()指定的承諾與在myJsonRest.put().then()評估的對象不同。

這是myJsonRest.put()部分的相同對象,無後顧之憂。您的問題在於,您在第一個片段中將.then()方法調用的結果分配給promise,並且確實返回了不同的承諾(請參閱the docs)。

比較

var promise; 
(promise = myJsonRest.put(data).then(function(){…})); 

var promise; 
(promise = myJsonRest.put(data)).then(function(){…}); 
1

傳遞給.then()需要返回你想要promise值的函數與解決:

var promise = myJsonRest.put(data).then(function(response){ 
    // act when put completes successfully 
    // do stuff with the response from the put request 
    return response; 
});