【问题标题】:Returning ajax data to different functions corresponding to different links将ajax数据返回给不同链接对应的不同函数
【发布时间】:2014-11-08 04:54:22
【问题描述】:

我正处于最大的挫折中,试图解决我的心理障碍:回调。我读过How to return value from an asynchronous callback function?How to return the response from an Ajax call?(在许多其他帖子中),确实后者有助于解决另一个问题。但是,我现在尝试做的只是略有不同,我正在失去理智试图使其适应我的代码。也许我的方法完全错误/存在根本缺陷(不仅仅是不成熟,我可以忍受)?

我的问题的本质是,不是简单地将ajax结果返回给回调函数,而是需要生成的json可用于不同的函数,对应于不同的事件,即:

linkOne.onclick = 调用 ajaxReq + getJsonData,然后以 getJsonData 结果作为参数调用 functionOne linkTwo.onclick = 调用 ajaxReq + getJsonData,然后以 getJsonData 结果作为参数调用 functionTwo linkThree.onclick = 调用 ajaxReq + getJsonData,然后以 getJsonData 结果作为参数调用 functionThree

这不能用 link.onclick 定义来完成吗?为什么这不起作用:

linkThree.onclick = functionOne(getJsonData);

这是我的代码:

function ajaxReq() {
    var request = new XMLHttpRequest();
    return request;
}

function getJsonData() {
    var request = ajaxReq();
    request.open("GET", "/myJSON.json", true);
    request.setRequestHeader("content-type", "application/json");
    request.send(null);
    request.onreadystatechange = function() {
        if (request.readyState === 4) {
            if (request.status === 200) {
                var myJsonString = JSON.parse(request.responseText);
                var myJsonArray = myJsonString["An Array in myJSON.json"];
                // functionOne(myJsonArray); // callback: what if I need to pass this value to various functions?
                return myJsonArray; // ... 'cause this ain't doin' it, and I don't know why
            }
        }
    } // onreadystatechange
} // getJsonData

function functionOne(myJsonArray) {
    var myJsonArray = getJsonData(); // why doesn't this work, since, in getJsonData, var request = ajaxReq(); returns an ajax request ?
}

为什么,如果 var request = ajaxReq();调用 ajaxReq 函数并将其结果返回给 getJsonData,是否 var myJsonArray = getJsonData();在functionOne中不一样吗?

对此的任何帮助都非常感谢。 (ps 寻求纯 JavaScript 修复,而不是 jQuery。)

svs

【问题讨论】:

    标签: javascript ajax callback


    【解决方案1】:

    正如您指定的链接中已回答的那样,我们不能从异步调用返回值以在同步函数调用中使用它。所以这是诀窍 -

    为所有的 onclick 监听器分配一个通用函数。

    link1.onclick = someCommonfunction;
    link2.onclick = someCommonfunction;
    link3.onclick = someCommonfunction;
    

    并定义如下通用函数,回调中会包含json数据,你可以将这些数据传递给任何函数调用。

    function someCommonfunction(e) {
        /* this is the function which will be finally executed with json data after clicking */
        var callback = function(jsonData) {
            var myJsonArray = jsonData; 
            //do some condition check and call functionOne, functionTwo or functionThree
    
        };  
        getJsonData(callback);    
    }
    

    我将getJsonData 修改为使用响应数据调用callback

    function getJsonData(callback) {
        var request = ajaxReq();
        request.open("GET", "/myJSON.json", true);
        request.setRequestHeader("content-type", "application/json");
        request.send(null);
        request.onreadystatechange = function() {
            if (request.readyState === 4) {
                if (request.status === 200) {
                    var myJsonString = JSON.parse(request.responseText);
                    var myJsonArray = myJsonString["An Array in myJSON.json"];              
                    callback(myJsonArray);              
                }
            }
        } // onreadystatechange
    } // getJsonData
    

    【讨论】:

    • 非常感谢。我了解这种结构,但可能不是 100%。根据您的回答,简单地检查您有回调(myJsonArray)的条件是否也是可行的,而是为每个条件一个唯一的回调,即 if (condition1){functionOne(myJsonArray); }, 否则 if (condition2){functionTwo(myJsonArray); } ?
    • 抱歉回复晚了。是的,你也可以这样做。
    • 再次感谢。我一直在研究这个,现在我正在重新审视这个概念。由于我会不必要地重新加载相同的数据,也许我应该调用 ajax/getJsonData onload,然后在页面加载后计算如何使这些数据用于其他功能。干杯,svs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2011-06-27
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多