如何在原生javascript中包装jsonP回调?
我正在使用native Promise,将一组XmlHttpRequests组合成一个结果,我想我已经实现了,看到了吗 (对flickr api的随机调用,请参阅控制台以了解实际发生的情况以及顺序) 可能会有较短的实现,但通过这段代码,我可以理解发生了什么 但随后出现了愚蠢的JSONP:-(事实证明,实际的目标站点不允许跨站点请求,我必须使用提供的JSONP端点(同样是用flickr模拟的),我被困在这里:愚蠢的全局回调不符合我对如何在原生javascript中包装jsonP回调?,javascript,ajax,jsonp,es6-promise,Javascript,Ajax,Jsonp,Es6 Promise,我正在使用native Promise,将一组XmlHttpRequests组合成一个结果,我想我已经实现了,看到了吗 (对flickr api的随机调用,请参阅控制台以了解实际发生的情况以及顺序) 可能会有较短的实现,但通过这段代码,我可以理解发生了什么 但随后出现了愚蠢的JSONP:-(事实证明,实际的目标站点不允许跨站点请求,我必须使用提供的JSONP端点(同样是用flickr模拟的),我被困在这里:愚蠢的全局回调不符合我对Promise 我认为解决办法必须与解释有关 我试图实现这一点,但
Promise
我认为解决办法必须与解释有关
我试图实现这一点,但它只起到了部分作用:没有实际输出,只有控制台消息,很抱歉。但是您可以看到有三个调用创建承诺,但是resolve()
,jsonflickrapasync()
只被调用一次
使用Promise处理jsonP回调的正确方法是什么,这样我就可以使用Promise.all()
来处理上述XmlHttpRequest版本中的结果
请不要使用jQuery-我想了解实际情况这不是承诺的问题,这是的问题。由于它使用全局回调,您需要为每个请求使用不同的回调-不同的名称。对于Flickr,这意味着您必须使用。参数名称可能因您的实际端点而异
然而,您对承诺的使用确实很奇怪。通常每个请求使用一个承诺来表示该请求的结果。您故意只创建一个全局承诺,这是行不通的
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;
我不认为你可以在jsonp中使用
promise
。我认为这个问题与@KJPrice无关。我知道我不能用xmlhttprequest调用jsonp服务。根本没有提到promise
?每次发出jsonp请求时,你必须使用不同的回调名称-否则,最后一个请求的函数在收到第一个函数的响应之前,将覆盖第一个函数的函数。