如何获得jsonpCallback的同步结果?

时间:2014-03-04 06:29:46

标签: javascript jquery ajax asynchronous jsonp

我想在while或for循环中调用jsonpcallback函数。但我得到异步结果。如何在jsonpcallback中实现。请帮助我解决此问题或提供任何其他解决方案。

window.onPublitoryOebPart = function(json) {
    window.publitoryOebPartJson = json;
    content = patchEditedContent(json);
    saveOebPartToc(content);
}
i = 0;
while(i < $("#oeb_parts_count").val()) {
    return unless $("#oeb-part-file-url-"+i).length > 0
    fileUrl = $("#oeb-part-file-url-"+i).html();
    $.ajax({
        url: fileUrl,
        crossDomain: true,
        dataType: "script",
        jsonpCallback: "onPublitoryOebPart"
    })
    i++;
}

1 个答案:

答案 0 :(得分:0)

JavaScript 无法获得“同步”JSONP结果。这是因为JSONP涉及创建一个新的脚本元素;这样一个动态创建的脚本元素只能异步加载资源。

JSONP请求只需use the success callback并以异步方式处理响应 。如果服务不允许指定动态函数,则仅手动指定jsonpCallback是必需/有用的。

如果在循环中使用success回调,则对read up on closures(以及read more)也很重要。

例如:

var i = 0; // Don't forget the "var"
while(i < $("#oeb_parts_count").val()) {
    var elm = $("#oeb-part-file-url-"+i);
    if (!elm.length) { return; } // Make sure to use valid syntax
    var fileUrl = elm.html();
    $.ajax({
        url: fileUrl,
        crossDomain: true,
        dataType: "script",
        success: function (i, fileUrl) {
            // Return a closure, the i and fileUrl parameters above
            // are different variables than the i in the loop outside.
            return function (data) {
                // Do callback stuff in here, you can use i, fileUrl, and data
                // (See the links for why this works)
                alert("i: " + i + " data: " + data);
            };
        })(i, fileUrl) // invocation "binds" the closure
    });
    i++;
}

通过命名函数创建闭包可能更简洁,但它的概念完全相同。


同样的XHR请求也非常不鼓励; XHR 不是 JSONP,即使这些请求也是使用jQuery.ajax函数创建的。