2012-08-27 68 views
2

有沒有什麼辦法可以從ajax的成功回調中訪問內部的Deferred對象?我希望能夠將抽象的ajax調用傳遞給函數,但是能夠將該函數調用包裝在$ .when()中,並使用reject()和resolve()將參數傳回給我的done()和失敗()回調,像這樣:我可以在AJAX延遲迴調中訪問Deferred對象嗎?

$.when(makeCall()) 
.done(function(data){ 
    //do something with data 
    }) 
.fail(function(message){ 
    //show error 
    }); 

function makeCall(){ 
    return $.ajax({ 
     url : //some url, 
     success : function(data){ 
       if(!data.someCondition){ 
       //i'd like to reject the internal deferred here 
       //and send it back an error message to my 
       //the callers fail method like reject('message') 
       } 
       else{ 
       //i'd like to resolve the deferred here and 
       //pass back the data to the callers done 
       //method like resolve(data) 
       } 
     } 
    }); 
} 

現在,我在另一個Deferred對象包裝MakeCall函數()和解決或拒絕一個在AJAX回調,但感覺就像我應該能夠做到這一點,而無需額外的Deferred包裝。

+0

而不是返回'$ .ajax'調用的結果,您是否嘗試將其設置爲一個變量並返回該變量?如果成功,你可以拒絕或解決它。我沒有嘗試過,但值得一試。 – MrOBrian

+0

@MrOBrian:這基本上是他想避免的包裝。 – pimvdb

+0

我實際上已經嘗試過,像'var dfd = $ .ajax({})'一樣,但是ajax函數只返回了promise,而不是整個Deferred對象,我可以調用resolve和reject。 – bittersweetryan

回答

1

不,它已經被解決或被拒絕。你將不得不創建自己的延期才能獲得此功能。

$.when(makeCall()) 
.done(function(data){ 
    //do something with data 
    }) 
.fail(function(message){ 
    //show error 
    }); 

function makeCall(){ 
    var def = $.Deferred(); 
    $.ajax({ 
     url : //some url, 
     success : function(data){ 
       if(!data.someCondition){ 
       // reject it 
       def.rejectWith(data.someCondition); 
       } 
       else{ 
       // resolve it 
       def.resolveWith(data); 
       } 
     } 
    }); 
    return def.promise(); 
} 

編輯:對不起,我不知道,這已經是你嘗試並試圖避免。問題在於,在成功回調中,延期對象已經解決。在這一點上不能撤銷。

編輯:
Woudln't它更有意義,讓服務器在發生錯誤的情況下返回一個錯誤代碼,而不是200?在這一點上,您可以將響應文本解析爲json,並適當地處理錯誤,而不會與延遲對象混淆不已。

+0

我不一定能夠控制迴應,比如說這是一個twitter搜索。如果twitter搜索失敗,你會在json return中得到一個叫做「error」的密鑰,但是這個調用會返回一個200狀態。我想檢查返回是否沒有錯誤鍵並返回數據,否則將錯誤消息傳遞給用戶。 – bittersweetryan

+0

我不認爲你有任何其他選擇,然後包裝它在延期對象。內部延遲對象沒有公開,我沒有看到在延遲對象被解析之後,在接收到響應之後沒有重寫'$ .ajax'方法的方法。 –

0

我需要做的是爲了防止競態條件 - 我想完全忽略一些迴應

有一次,我發現我不能拒絕原遞延最後我做這樣的事情。不理想,但爲我所需要的工作。當然,即使我能夠拒絕推遲(或創建自己的),這可能不是我想要的,因爲它也不是真正的失敗情況。

function makeCall() 
{ 
    return $.ajax({ 
     url : //some url, 
     success : function(data) 
     { 
       if (!data.someCondition) 
       { 
       data.ignore = true; 
       } 
     } 
    }); 
} 


makeCall().done(function(data) 
{ 
     if (data.ignore) 
     { 
      return; 
     } 
}); 
相關問題