【问题标题】:jQuery: Adding "callback" Parameter for JSONP Doesn't Trigger CallbacksjQuery:为 JSONP 添加“回调”参数不会触发回调
【发布时间】:2014-04-03 09:41:45
【问题描述】:

以下代码使用 jQuery 的 getJSON 调用服务,没有useJsonp 部分,对我来说很长一段时间都可以正常工作。然后,需要支持 JSONP,并添加了if (useJsonp) 条件。这也可以正常工作,直到 HTTP 请求失败。当我以 404 响应失败(使用 Fiddler)时,没有回调(.done.fail 被调用)。当请求没有失败时,我会得到.done 回调。

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();
};

这是为什么呢?我该怎么做才能调用回调?

谢谢

【问题讨论】:

  • 你在那儿干吗? $.getJSON 已经返回了一个承诺,$.when() 已经返回了一个承诺,绝对没有理由使用 $.Deferred()。只需return $.getJSON(useJsonp?url+'&callback=?':url) 就足够了。
  • 感谢@Bergi - 我编辑了代码以证明即使 getJSON 成功,我也可能需要拒绝它。所以我可以打电话给return $.getJSON(...),我需要做点什么,然后返回承诺。整个代码的调用方式有点像这样:$.when(getData(url)).done(...).fail(...).
  • 好的,你仍然应该使用then(如this),而不是manually constructing deferreds

标签: javascript jquery ajax jsonp promise


【解决方案1】:

$.当右括号丢失时,是不是因为这个,请尝试,其他代码是正确的。这就是它要实现的方式。

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();

【讨论】:

  • 那里没有缺少右括号。完成和失败的回调是链式的。
【解决方案2】:

对于 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!");
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2014-07-20
    • 2011-03-16
    • 2012-05-04
    • 2014-04-30
    相关资源
    最近更新 更多