gpt4 book ai didi

javascript - 如何在 native javascript Promise 中包装 jsonP 回调?

转载 作者:行者123 更新时间:2023-11-30 12:26:58 25 4
gpt4 key购买 nike

我正在使用 native Promise 将一堆 XmlHttpRequest 组合成一个结果,我想我成功了,请参阅 http://jsfiddle.net/pjs06hdo/(随机调用 flickr api,查看控制台以了解实际发生的情况)

可能会有更短的实现,但使用这段代码我可以理解发生了什么。

但是随后出现了愚蠢的 JSONP :-( 因为事实证明实际目标站点不允许跨站点请求,我必须使用提供的 jsonP 端点(再次用 flickr 模拟)我被卡住了:那个愚蠢的全局回调不符合我对 Promise

的基本理解

我认为解决方案与 How do I convert an existing callback API to promises? 中的解释有关.

我试图实现它,但它只部分起作用:http://jsfiddle.net/b33bj9k1/没有实际输出,只有控制台消息,抱歉。但是您可以看到创建 promise 的三个调用,但 resolve()jsonFlickrApiAsync() 只被调用一次。

使用 Promise 处理 jsonP 回调的正确方法是什么,以便我可以使用 Promise.all() 来处理上面 XmlHttpRequest 版本中的结果?

请不要使用 jQuery - 我想了解到底发生了什么

最佳答案

这不是 promises 的问题,这是 JSONP 的问题.由于它使用全局回调,因此您需要为每个请求使用不同的回调 - 具有不同的名称。对于 Flickr,这意味着您必须使用 their jsoncallback url parameter .参数名称可能因您的实际端点而异。


不过,你对promises的使用确实很奇怪。通常,您会为每个请求使用一个 promise 来表示该请求的结果。您有意只创建一个全局 promise ,这是行不通的。

function loadJSONP(url, parameter="callback") {
var prop = "loadJSONP.back" + loadJSONP.counter++;
var script = document.createElement("script");
function withCleanUp(r) {
return (x) => {
loadJSONP[prop] = null;
document.head.removeChild(script);
r(x);
}
}
return new Promise((resolve, reject) => {
loadJSONP[prop] = withCleanUp(resolve);
script.onerror = withCleanUp(reject);
// setTimeout(script.onerror, 5000); might be advisable

script.src = url+"&"+parameter+"="+prop;
document.head.appendChild(script);
});
}
loadJSONP.counter = 0;

关于javascript - 如何在 native javascript Promise 中包装 jsonP 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com