javascript - 将ajax数据返回给不同链接对应的不同函数

标签 javascript ajax callback

我正处于沮丧的顶峰,试图解决我的心理障碍:回调。我读过How to return value from an asynchronous callback function?How to return the response from an Ajax call? (以及许多其他帖子),实际上后者对解决另一个问题很有帮助。然而,我现在尝试做的事情略有不同,我正在失去理智试图使其适应我的代码。也许我的方法是完全错误的/根本上有缺陷(不仅仅是不成熟,这是我可以忍受的)?

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

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 中不做同样的事情吗?

非常感谢您对此的任何帮助。 (p.s. 寻求纯 javascript 修复,而不是 jQuery。)

svs

最佳答案

正如您指定的链接中所回答的那样,我们无法从异步调用返回值以在同步函数调用中使用它。所以这就是技巧 -

为所有 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

关于javascript - 将ajax数据返回给不同链接对应的不同函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809509/

相关文章:

javascript - 我的应用程序读取 txt 文件,即使它们被删除

javascript - 限制函数中动态列表项的数量

javascript - 调用 iFrame 按钮,然后调用父按钮

ruby - 有没有一种干净的方法来测试 Rspec 中的 ActiveRecord 回调?

javascript - 如何在 AJAX 加载的 HTML 上创建新的 Bootstrap 选择器控件?

java - DatastoreMutationPool 是否在回调之前刷新到数据存储区?

javascript - 语义-ui-react语法错误: Adjacent JSX elements must be wrapped in an enclosing tag

javascript - TinyMCE -> 无法读取 null 的属性 'setAttribute'

javascript - vue 2.3 AJAX数据绑定(bind)不更新

javascript - 如何在 jQuery 中单击后禁用按钮