jquery jsonp回调覆盖

hmmo2u0o  于 2023-02-12  发布在  jQuery
关注(0)|答案(1)|浏览(108)

我有一个应用程序发出多个jsonp请求,所有请求都使用相同的jsonpCallback,我无法更改它。
我尝试在下面的代码中重现这种情况。
输出有些随机,但它几乎不包括contextvar的所有可能值。
在我看来,jquery全局注册了“myFunc”,并且对于来自requestMaker的每个新请求,都会覆盖此关联。
如何不覆盖上下文,在这种情况下,如何打印所有值?

<script type="text/javascript">
var requestMaker = function(url, contextvar) {
    $.ajax({
        url: url,
        crossDomain: true,
        dataType: 'jsonp',
        jsonpCallback: "myFunc"
    }).done(function(data) {
        console.log(contextvar);
    });
};

requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request1");
requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request2");
requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request3");
requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request4")

</script>
bxgwgixi

bxgwgixi1#

是的,回调函数"myFunc"似乎占用了全局作用域,因此不能并行运行。下面的代码段连续运行四个jsonp调用,一个接一个。不太理想,但至少您得到了您的结果。一些API提供了一个参数callbackjsonp来指定填充回调函数的名称。然而,这里使用的API不提供这样的参数。

var requestMaker = async function(url, contextvar) {
  return $.ajax({
    url: url,
    crossDomain: true,
    dataType: 'jsonp',
    jsonpCallback: "myFunc",
  }).done(function(data) {
    console.log(contextvar,data);
  });
};

(async function(){
await requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request1");
await requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request2");
await requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request3");
requestMaker("https://www.w3schools.com/js/demo_jsonp.php", "request4");
})(); // execute the async IIFE
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>

jsonp被认为是AJAX请求的"历史"协议,最初于2004年提出,请参见此处:https://en.m.wikipedia.org/wiki/JSONP。它存在一定的安全问题,并于2014年被CORS淘汰。

相关问题