2012-05-02 50 views
2

我有一個情況我需要初始化/從一個jQuery AJAX調用的結果分配變量,再往上重用這些變量下的JS腳本變量:如何使用和重複使用跨職能

var shouldRedirect = ??? 

$.ajax({ 
    url: 'http://example.com', 
    type: 'GET', 
    data: 'blah', 
    asynch: false, 
    timeout: 1800, 
    success: function(data) { 
     shouldRedirect = data.rows[0].redirectFlag 
    } 
}); 

if(shouldRedirect) 
    window.location = "..."; 
我有

兩個問題:

  • 假設產生的JSON將包含redirectFlag布爾,是data.rows[0].redirectFlag獲取我的變量的值的正確方法?;和
  • 在AJAX啓動之前,我怎樣初始化shouldRedirect(我怎麼說「創建一個變量但是不給它一個值!」)?

在此先感謝!

+2

你'asynch'財產是錯誤的,它應該是'async'。如果請求是異步的,這永遠不會起作用,所以你需要改變它。 –

+0

@JamesAllardice:我會說這很好。同步請求無論如何:) – ThiefMaster

+0

@ThiefMaster - 同意,他們是壞的,但在這種情況下,這是唯一的方法來做OP的嘗試做的事情(使用AJAX請求返回的'成功'事件之外的值處理程序)。 –

回答

1

你可以簡單地做聲明未初始化的變量如下:

var shouldRedirect; 

如果你的邏輯需要它,你當然可以把它初始化爲false:

var shouldRedirect = false; 

這可能不是你想要什麼雖然。您可以檢查是否一個變量被初始化通過嚴格的比較來undefined

if (shouldRedirect === undefined) // do something 

不過請注意,您必須使用三等於運算符(又名嚴格平等),或您的結果將無法達到預期。另一方面,未定義的變量會產生虛假結果。這意味着當使用簡單的if (shouldRedirect)檢查變量並且變量未定義時,它將產生false,就好像它被設置爲false。對於JavaScript中的其他一些值也是如此,例如空字符串""或值null。你可以看到一個完整的虛假值列表here。如果你想明確地檢查真或假,並且想要省略其他的錯誤或真值,那麼你應該檢查三重平等,例如if (shouldRedirect === true)

此外,如果data.rows[0].redirectFlag是訪問該值的正確方式,則高度依賴於您從AJAX調用中收到的數據結構的實際外觀。如果是像下面這將是正確的:

{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] } 

如果你的JSON看起來像下面雖然

{ redirectFlag: false } 

,那麼你必須訪問redirectFlag簡單地data.redirectFlag

0
  • 我怎麼初始化shouldRedirect到AJAX開工前(我怎麼說「創建一個變量,但沒有給它的值呢!」)?

    你可能只是做:var shouldRedirect;

不過,我會做var shouldRedirect = false;確保shouldRedirect不是未定義

  • 是data.rows [0] .redirectFlag獲得的正確方法值爲我的變量?

取決於您從AJAX請求發回的內容。通常的反應是JSON,所以如果你發送一個JSON對象回來真值那麼你可以做:

shouldRedirect = data.redirectFlag; 
0

對於部分#1來聲明一個變量與具有價值的使用它: 變種shouldRedirect。這樣你就可以做一個if(!shouldRedirect){}。

部件#2。如何從redirectFlag獲取值取決於從ajax調用返回的數據的形成。數據...將成爲您獲取價值的起點。

0

正如在評論部分中提到,設置shouldRedirect標誌不會幫助作爲下面的$.ajax請求將被評估之前的結果是從服務器獲取的if聲明 - 這是面臨的異步常見問題代碼執行。儘管理論上可以通過sync參數強制jQuery.ajax進入同步模式,但我不會推薦這樣做,因爲它會在請求發生時鎖定瀏覽器UI。

您需要將您的重定向代碼到$.ajaxsuccess功能,像這樣:

$.ajax({ 
    url: 'http://example.com', 
    // ... other options omitted for brevity 

    success: function(data) { 
     // This code block gets executed when the operation completes. 
     var shouldRedirect = data.rows[0].redirectFlag 
     if (shouldRedirect) { 
      // Your redirection code goes here. 
      window.location = "..."; 
     } 
    } 
}); 

如果您使用jQuery 1.7或更高,可以使通過defered object使用他們Promises/A實現。被保護對象允許您在操作完成時執行一個或多個函數,並使異步代碼更易於閱讀。

$.ajax({ url: 'http://example.com' }) 
    .done(function(data) { 
     // This code block gets executed when the operation completes. 
    }); 

不是傳遞函數閉包done的,你也可以通過參考成員函數,例如:

$.ajax({ url: url }).done(onDataLoaded); 

function onDataLoaded(data) { 
    // This function gets called when the ajax operation completes. 
}