首页 > 解决方案 > 将 AJAX 作为自己的参数的函数作为函数参数的问题

问题描述

我可以 console.log(arg) 但不能 arg.response。好奇//编辑背后的原因是什么:当我控制台日志 arg 时,我可以清楚地看到带有数据的响应属性

   function doAjax(param, lambda) {
        let _xhttp = new XMLHttpRequest();
        _xhttp.open("GET", param, true);
        _xhttp.send();
        _xhttp.onload = lambda(_xhttp);
    }
    
    doAjax("ALL_FRAMES", function(arg) {
         console.log(arg.response); --> prints blank field in console
         //allFrames = JSON.parse(arg.response);
    });

标签: javascript

解决方案


_xhttp.onload = lambda(_xhttp);

这意味着“lambda(_xhttp)立即调用,然后将其返回值分配给_xhttp.onload”。相反,您想将一个函数分配给onload,该函数lambda稍后将调用:

_xhtttp.onload = () => lambda(_xhttp);

// 编辑:当我控制台记录 arg 时,我可以清楚地看到带有数据的响应属性

这只是开发工具处理日志对象方式的一个怪癖。记录对象时,在您单击开发工具中的对象之前,不会评估该对象。因此,在console.log运行时它还没有响应,但是当您单击时,它确实有响应。


推荐阅读