从另一个文件访问函数的返回值

时间:2012-08-25 09:48:01

标签: javascript jquery jquery-ui jquery-mobile

我有一个js文件,代码为:

function postResponse(url1,param1)
{
var url = intranetUrl + encodeURI(url1);

 var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.onload = function(e)
    {
        if (this.status == 200)
        {
            genericRes = this.responseText;
            console.log("inside fun:"+genericRes);
            return genericRes;
        }
        alert("!!!"+this.status);
    };

    xhr.send(param1);


}

现在从另一个文件我想访问这个函数我在这个文件中导入了上面的文件并调用函数:

<script type="text/javascript">

        var resss = postResponse("myURL","ACC|^ALL|^M|^|$");
        alert("genericRes"+genericRes);
        console.log("genericRes>>>"+genericRes);
        console.log("resss>>>"+resss); 

    </script>

但是在这里我得到了genericRes并且resss值为undefined,并且首先在console.log上打印,然后在这里打印console.log("inside fun:"+genericRes);我得到了正确的输出,但是从调用代码它给我未定义。

在java中我们编写可以返回String的假设方法:

public String myMethod()
{
      str = "MyString";
      return str;
}

并将该方法称为:

String str1 = myMethod();

但是如何在jquery中执行此操作?

任何建议将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:2)

如果你仔细看,你正在定义另一个函数,如:

function(e) //<-- this is the another function
{
    if (this.status == 200)
    {
        var genericRes = this.responseText;
        console.log("inside fun:"+genericRes);
        return genericRes; //<-- this only applies to this function
    }
    alert("!!!"+this.status);
};

因此它会将该值返回给xhr.onload的调用者,这是浏览器,浏览器不会对返回值执行任何操作。

此外,您无法真正从异步操作返回,您必须使用回调。

所以:

function postResponse(url1, param1, callback) { // <-- take a callback parameter
    var url = intranetUrl + encodeURI(url1);
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.onload = function(e) {
        if (this.status == 200) {
            var genericRes = this.responseText;
            callback( genericRes ); // <-- call the callback
        }
    };
    xhr.send(param1);
}

然后在你的代码中:

postResponse("myURL", "ACC|^ALL|^M|^|$", function(result) {
    alert(result); //Result is only available here. In this anonymous function defined inline. Yes.
});