XMLHttpRequest获取响应之后,怎么在函数外调用响应的内容呀,求大佬解答一下

1.找到一个公开的诗词API,尝试写了个一个js去请求,但会因为网络或者接口的原因,导致请求超时或者失败,于是想写一个判断返回然后超时或者失败重新请求的js,苦于新手,一直不知道怎么拿到返回的数据,代码如下

2.请求代码

function get(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            // 判断参数
            if (typeof callback === "function") {
                // 百度到的,也想尝试一下apply用法
                callback.apply(xhr);
            }
        }
    };
    xhr.send();
}

var finalUrl = "http://yijuzhan.com/api/word.php?m=json";
var data;
// get() 会立即执行,这个问题好像和异步同步调用有关,所以也是尝试一下
data = get(finalUrl,
    // 这个时候,回调函数是在响应到达之后调用
    function () {
        // 这时候的this是xhr,apply();
        var resp  = JSON.parse(this.responseText);

        // now do something with resp
        console.log(resp);
                //结果是{content: "一朵芙蕖,开过尚盈盈。", source: "苏轼《江神子·江景》"}

    }
);
console.log(data);//结果是undefined,如何获取(data)

3.尝试

function get(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {

            if (typeof callback === "function") {

                callback.apply(xhr);
                                //return resp; 这是尝试
            }
        }
    };
    xhr.send();
        //return resp; 这是尝试
}    

尝试过在回调函数里加上return,还是undefined,百度之后,大概明白,因为XMLHttpRequest();是异步函数,直接return,返回的是响应未到达的结果,所以为undefined,

4.想问的是

1.有没有大佬指点一下,怎么才能获取resp,
2.或者XMLHttpRequest();这个对象在超时或者失败的或者返回为空的时候,有没有什么方法重新请求,看了w3c的说明,
xhr.timeout =ms;可以设置超时,超过 timeout 时间请求还没有结束(包括成功/失败),则会触发ontimeout事件
但我有点死脑筋,还是想搞到resp。嘿嘿
3.虽然新手一枚,害,但大佬该骂骂。

3个回答

你把你的 xhr.open("GET", url, true); 最后一个参数改成false试试,改为false这个请求应该就是同步的了,就会代码依次执行了,把你里面的return加上,

dusttaker
日了狗 好的,谢谢大佬,我去试试
4 个月之前 回复

为啥非要用javascript 不用jquery

dusttaker
日了狗 好的,谢谢大佬,我去看一下jQuery
4 个月之前 回复
因为 XMLHttpRequest 默认是异步处理的,就是回调逻辑一般是外面顺序代码执行完成后空闲了才会执行的。
要想先执行回调再继续外面的逻辑,只能将其改成同步方法,先执行回调代码再继续。
dusttaker
日了狗 嗯嗯,我去尝试一下,谢谢大佬
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问