2012-06-19 61 views
0

我想在做AJAX請求時僞造同步JavaScript。 我有一個getPagePath(id)函數需要通過給頁面頁面ID來獲取頁面的頁面路徑,它通過web API接收數據。我認爲這會很簡單,只需向服務器發送ajax請求並接收頁面路徑即可。但是發生了什麼事情:當請求頁面路徑時,我的代碼繼續運行並返回一個空的var,之後ajax調用完成,但是延遲。while while循環中的Javascript同步超時

我知道我的解釋是不是太多這樣說這裏是我的代碼:

var getPagePath = function() { 

    // Function to check if this.pagePath is set. 
    var pagePathReady = function() { 
     console.log('PAGEPATH: CHECKING'); 
     if (this.pagePath && this.pagePath != null) { 
      return true; 
     } else { 
      return false; 
     } 
    }; 

    if (!pagePathReady()) { 
     // No pagePath defined so lets set it. 
     this._setPagePath(); 

     while (!pagePathReady()) 
     { 
      // Not yet defined, check again.. 

      // *** The problem *** 
      // This while loop is running insanely fast making the browser crash. 
      // How can I make this wile loop pause for 1 sec? 
      // ******************* 

      console.log('PAGEPATH: NOT READY -> CHECK AGAIN'); 
     } 

     // READY 
     console.log('PAGEPATH: READY -> VALUE: ' + this.pagePath); 
     return this.pagePath; 
    } else { 
     return this.pagePath; 
    } 
}; 

var _setPagePath = function() { 
    if (!this.pagePathRequestFired) { 
     this.pagePathRequestFired = true; 
     // Fire request. 
     system.url(
      this.getNodeId(), 
      function(url) { 
       // Request ready, set pagePath. 
       this.pagePath = url; 
       this.pagePathRequestFired = false; 
      }, 
      this 
     ); 
    } else { 
     // Call already running.. 
    } 
}; 

我已經在多個解釋意見設置的問題。

在此先感謝!

回答

1

如果您確實需要,您可以使ajax調用同步。

xmlhttp.open("GET", "url", false); 

注意第三個參數。

但是,我認爲你只需要更多的練習來編寫代碼來處理事件/回調概念。

1

而不是輪詢pagePath(這似乎並不需要恕我直言)爲什麼不只是在_setPagePath準備好時執行回調?如果您想僞造一個同步請求,則只需將一個加載微調器作爲疊加層顯示給用戶,即可禁用UI。

+0

我使用這種方法導致需要在另一段代碼中設置'pagePath',我把它設置爲'paramBag.path = this.controller.getPagePath();' –

+0

除了上面的評論: 我使用這種方法導致需要在另一段代碼中設置'pagePath',我將它設置爲'paramBag.path = this.controller.getPagePath();'當使用回調時,'getPagePath()'將在請求仍在運行時返回'undefined'。當請求準備就緒時,它會調用回調函數,但回調函數無法設置paramBag中的屬性。對不起,我知道事情並不清晰。很難解釋這種情況.. –