簡體   English   中英

如何根據ajax get請求的成功/失敗在適當的范圍內更改javascript變量

[英]How to change javascript variable at appropriate scope based on success/failure of ajax get request

我想根據文件是否存在來編輯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,而不是瀏覽器)

這些嘗試都沒有奏效,但如果我接近,請告訴我。 非常感謝您的參與。

由於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!
}

嘗試

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` 
});

context查看jQuery.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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM