dusttaker 2020-04-20 16:39 采纳率: 0%
浏览 538

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条回答 默认 最新

  • 简_洋 2020-04-20 17:07
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制