Pass additional parameter to a JSONP callback

后端 未结 4 791
逝去的感伤
逝去的感伤 2020-12-17 17:47

For a project of mine I need to do multiple calls to a (remote) API using JSONP for processing the API response. All calls use the same callback function. All the calls are

4条回答
  •  悲哀的现实
    2020-12-17 18:12

    Since it seems I can't comment, I have to write an answer. I've followed the instructions by jfriend00 for my case but did not receive the actual response from the server in my callback. What I ended up doing was this:

    var callbacks = {};
    
    function doJsonCallWithExtraParams(url, id, renderCallBack) {
        var safeId = id.replace(/[\.\-]/g, "_");
        url = url + "?callback=callbacks." + safeId;
        var s = document.createElement("script");
        s.setAttribute("type", "text/javascript");
        s.setAttribute("src", url);
    
        callbacks[safeId] = function() {
            delete callbacks[safeId];
            var data = arguments[0];
            var node = document.getElementById(id);
            if (data && data.status == "200" && data.value) {
                renderCallBack(data, node);
            }
            else {
                data.value = "(error)";
                renderCallBack(data, node);
            }
    
            document.body.removeChild(s);
        };
    
        document.body.appendChild(s);
    }
    

    Essentially, I compacted goJSONP and getDataForUrl into 1 function which writes the script tag (and removes it later) as well as not use the "unshift" function since that seemed to remove the server's response from the args array. So I just extract the data and call my callback with the arguments available. Another difference here is, I re-use the callback names, I might change that to completely unique names with a counter.

    What's missing as of now is timeout handling. I'll probably start a timer and check for existence of the callback function. If it exists it hasn't removed itself so it's a timeout and I can act accordingly.

提交回复
热议问题