我想在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++;
}
最佳答案
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
函数创建的。