如何在原生javascript中包装jsonP回调?

如何在原生javascript中包装jsonP回调?,javascript,ajax,jsonp,es6-promise,Javascript,Ajax,Jsonp,Es6 Promise,我正在使用native Promise,将一组XmlHttpRequests组合成一个结果,我想我已经实现了,看到了吗 (对flickr api的随机调用,请参阅控制台以了解实际发生的情况以及顺序) 可能会有较短的实现,但通过这段代码,我可以理解发生了什么 但随后出现了愚蠢的JSONP:-(事实证明,实际的目标站点不允许跨站点请求,我必须使用提供的JSONP端点(同样是用flickr模拟的),我被困在这里:愚蠢的全局回调不符合我对Promise 我认为解决办法必须与解释有关 我试图实现这一点,但

我正在使用native Promise,将一组XmlHttpRequests组合成一个结果,我想我已经实现了,看到了吗 (对flickr api的随机调用,请参阅控制台以了解实际发生的情况以及顺序)

可能会有较短的实现,但通过这段代码,我可以理解发生了什么

但随后出现了愚蠢的JSONP:-(事实证明,实际的目标站点不允许跨站点请求,我必须使用提供的JSONP端点(同样是用flickr模拟的),我被困在这里:愚蠢的全局回调不符合我对
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请求时,你必须使用不同的回调名称-否则,最后一个请求的函数在收到第一个函数的响应之前,将覆盖第一个函数的函数。