2014-03-02 135 views
0

以下代碼片段使用jQuery的getJSON調用服務,沒有使用useJsonp部分,長時間工作良好。然後,需要支持JSONP並添加了if (useJsonp)條件。這也可以正常工作,直到HTTP請求失敗。當我使用404響應失敗時(使用Fiddler),沒有任何回調(調用.done.fail)。當請求沒有失敗時,我得到.done回調。jQuery:爲JSONP添加「回調」參數不會觸發回調

function getData(url){ 
    var dfd = $.Deferred(); 
    if (useJsonp) { 
     url += '&callback=?'; 
    } 
    $.when($.getJSON(url)) 
     .done(function (dataObj) { 
      if (!dataObj || dataObj.Status === 'failed') { 
       dfd.reject(dataObj); 
      } 
      else { 
       doSomething(dataObj); 
       dfd.resolve(dataObj); 
      } 
     }) 
     .fail(function (jqXHR) { 
      dfd.reject(jqXHR); 
     }); 
    return dfd.promise(); 
}; 

這是爲什麼?我能做些什麼來使回調被稱爲?

感謝

+0

WTH你在幹什麼呢? '.getJSON'已經返回一個promise,'$ .when()'已經返回一個promise,絕對沒有理由使用'$ .Deferred()'。只需'返回$ .getJSON(useJsonp?url +'&callback =?':url)'就夠了。 – Bergi

+0

謝謝@Bergi - 我編輯了代碼來演示即使getJSON成功,我可能需要拒絕它。所以我可以調用'return $ .getJSON(...)',我需要做一些事情然後返回諾言。這個完整的代碼有點像這樣調用:'$ .when(getData(url))。done(...)。fail(...)'。 – Haji

+0

好的,你仍然應該使用['then'](http://api.jquery.com/deferred.then/)(像[this](http://stackoverflow.com/q/10843297/1048572)),而不是[手動構建延遲](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#wiki-the-deferred-anti-pattern) – Bergi

回答

0

$。當閉合支架mising,是不是因爲這一點,請嘗試其他代碼是迄今爲止正確的。這是它要實現的方式。

var dfd = $.Deferred(); 
if (useJsonp) { 
    url += '&callback=?'; 
} 
$.when($.getJSON(url)) 
    .done(function (dataObj) { 
     dfd.resolve(dataObj); 
    }) 
    .fail(function (jqXHR) { 
     dfd.reject(jqXHR); 
    })); 
return dfd.promise(); 
+0

沒有右括號在那裏丟失。已完成和失敗回調被鏈接。 – Haji

0

對於JSONP要求我做到以下幾點:

$.ajax(url, { 
    dataType: useJsonp ? "jsonp" : undefined, 
    success: function(result) { 
     console.log(result); 
     alert("It worked!"); 
    }, 
    error: function(result) { 
     console.log(result); 
     alert("It didn't work!"); 
    } 
});