使用模块模式函数返回XMLHttpRequest解析的数据

时间:2016-06-03 12:59:33

标签: javascript ajax callback revealing-module-pattern

我在组合javascript回调和揭示模块模式时遇到了问题。 我尝试做的是使用carsData.getCars()函数方法返回HTTP响应文本。

基本上我想做的是:

  1. 将数据从xhr.onreadystatechange函数返回到私有getData函数
  2. 将数据从getData函数返回到公共getCars函数(或调用返回值的getCars函数)
  3. 我让它使用同步AJAX模式,但我知道它不是javascript开发中的最佳实践。

    我试图让它与回调一起使用,但失败了。 在javascript中甚至可行吗?

    P.S。我在Vanilla JS中使用XMLHttpRequest而不是其他框架用于学习目的。

    'use strict';
    var carsData = (function() {
        var carsElement = document.getElementById('carsListing'),
            successHandler = function(data) {
                carsElement.innerHTML = data.data;
                //return data;
            },
            dataWrapper = "",
            getData = function(callback) {
                var url = 'data/cars.json',
                    xhr = new XMLHttpRequest();    
    
                xhr.onreadystatechange = function() {
                    var status;
                    var data;
    
                    if (xhr.readyState == 4) { // `DONE`
                        status = xhr.status;
                        if (status == 200) {
                            data = JSON.parse(xhr.responseText);
                            successHandler && successHandler(data);
                            callback(data);
                            return data;
                        }
                    }
                };
                xhr.open('get', url, false); // synchronous js
                xhr.send();
                return xhr.onreadystatechange();
                //return 'xx';
            }
    
        return {
            getCars: function() {
                return getData(function(data){
                  console.log(data); // Object {data: Array[5]}
                })
            }
    
        }
    })();
    

1 个答案:

答案 0 :(得分:0)

没有。你不能这样做。我发现这就是为什么你通常会看到发送到DOM对象的结果。因为他们在那里等待答案。您的返回声明(假设您来自非原型语言)看似违反直觉,已经运行了。它似乎不会,但它有,因为你知道的异步性质。你必须使用Promises,或者你必须让你的回调用“等待”回调数据的数据做一些事情,就像你使用successdata一样。