簡體   English   中英

如何在原生 javascript Promise 中包裝 jsonP 回調?

[英]How to wrap jsonP callback in native javascript Promise?

我正在使用本機 Promise 將一堆 XmlHttpRequests 組合成一個結果,我想我可以正常工作,請參閱http://jsfiddle.net/pjs06hdo/ (對 flickr api 的隨機調用,請參閱控制台了解實際發生的情況按什么順序)

可能有更短的實現,但通過這段代碼,我可以理解發生了什么。

但是后來出現了愚蠢的 JSONP :-( 事實證明,實際的目標站點不允許跨站點請求,我必須使用提供的 jsonP 端點(再次用 flickr 模擬)而在這里我被卡住了:那個愚蠢的全局回調不符合我對Promise基本理解

我認為該解決方案與如何將現有回調 API 轉換為承諾中的解釋有關? .

我試圖實現這一點,但它只能部分工作: http : //jsfiddle.net/b33bj9k1/沒有實際輸出,只有控制台消息,抱歉。 但是在那里你可以看到有三個調用來創建承諾,但resolve()jsonFlickrApiAsync()只被調用一次。

使用 Promise 處理 jsonP 回調的正確方法是什么,以便我可以像上面的 XmlHttpRequest 版本那樣使用Promise.all()來處理結果?

請不要使用 jQuery - 我想了解到底發生了什么

這不是 promises 的問題,這是JSONP的問題。 由於它使用全局回調,因此您需要為每個請求使用不同的回調 - 具有不同的名稱。 對於 Flickr,這意味着您必須使用他們的jsoncallback url 參數 參數名稱可能因您的實際端點而異。


但是,您對 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM