如何根据ajax get请求的成功/失败在适当的范围内更改javascript变量

时间:2015-02-19 16:06:00

标签: javascript jquery ajax get scope

我想根据文件是否存在来编辑javascript变量。我能实现这样的目标吗?

     var url="Content/Features/column1.html";
     var url2="";
     $.ajax({
            url: url,
            error: function()
            {   
               url2 = "something";
            },
            success: function()
            {
                url2 = "something else";
            }
        }); 

我的理解是这里的典型问题是ajax中的异步。我应该以某种方式使用回调方法或承诺吗?

可能是这样的:

var url="Content/Features/column1.html";
     var url2="";
var result = $.ajax({
        url: url,
        error: function()
        {   
           url2 = "something";
           handleData(url2);
        },
        success: function()
        {
            url2 = "something else";
            handleData(url2);
        }
    }); 

response = function handleData( responseData ) {
    return responseData;
}   

甚至:

var url="Content/Features/column1.html";
var url2="";
function test(url) {
    return $.ajax(
    {
        url: url
    }
    );
}

test().done(function(url2) {
    url2= "something"

}).fail(function() {
    url2= "something else"
}); 

如何在声明它的同一范围内更改url2?或者有没有办法从回调函数返回一个值并根据它改变url2?

或者,是否有更好的方法来检查此文件是否存在? (在你告诉我浏览器不允许对本地文件的ajax请求之前,请知道我使用的是node-webkit,而不是浏览器)

这些尝试都没有奏效,但如果我接近,请告诉我。非常感谢您的参与。

2 个答案:

答案 0 :(得分:0)

由于AJAX本质上是异步的,因此您无法从函数返回值,而是需要实现回调。你可以这样做:

function getURL2(callback) {
    callback = callback || function() {};

    var url="Content/Features/column1.html";
    var url2="";
    $.ajax({
            url: url,
            error: function()
            {   
               callback("something");
            },
            success: function()
            {
                callback("something else");
            }
        }); 


}



getURL2(function(url2) {
   // the call is complete and url2 is set correctly!
}

答案 1 :(得分:0)

尝试

var url1 = "Content/Features/column1.html"
, res = {"url2": void 0} // `this` `context` within `$.ajax` call at `request`
, request = function request(url1, res) {
  return $.ajax({
             context: res // set `this` to `res` object
             , url: url1
             , method: "GET"
             , success: function(data, textStatus, jqxhr) {
                 this.url2 = "something"; // `success` 
                 return this // return `this` : `res`
               }
             , error: function(jqxhr, textStatus, errorThrown) {
                 this.url2 = jqxhr.status === 404 // `404` , `Not Found`
                             ? "somethingElse" // `error`
                               // if `error` other than `404`, 
                               // return `jqxhr.status`
                             : jqxhr.status; 
                 return this // return `this` : `res`

               }
          });
};
request(url1, res).always(function(response) {
   // `this` : `res` 
   console.log(response.status
               , response.statusText
               , response.state()
               , this.url2); // if `error` , `somethingElse` , else `something` 
});

contextjQuery.ajax( [settings ] )

上查看deferred.always()

var url1 = "https://gist.githubusercontent.com/anonymous/9a6997f09de9b68c59b2/"
           + "raw/f7d7b756005ad6d2b88cf0211f78a2990d7d2dc7" + "123" // `404` `error`
, res = {"url2":void 0}
, request = function request(url1, res) {
  return $.ajax({
             context: res
             , url: url1
             , method: "GET"
             , success: function(data, textStatus, jqxhr) {
                 this.url2 = "something";
                 return this
               }
             , error: function(jqxhr, textStatus, errorThrown) {
                 this.url2 = jqxhr.status === 404 
                             ? "somethingElse" 
                             : jqxhr.status;
                 return this
                             
               }
          });
};
request(url1, res).always(function(response) {
   console.log(response.status
               , response.statusText
               , response.state()
               , this.url2);
   document.write(JSON.stringify(this))
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>