簡體   English   中英

如何在不使用參數的情況下在javascript中傳遞變量?

[英]How can I pass variable in javascript without using parameter?

我有一個函數用於從文本文件獲取數據並在另一個函數中發出警報。

  var library_name; // Global Variable

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
         });
  }

 function saveFeedback() {
    alert(library_name);
  }

調用saveFeedback時,它將警告library_name

我試圖把它放在這樣的相同功能中

function saveFeedback() {
    jQuery.get('stream.txt', function(data) {
         library_name = data.toString().substring(17,data.length);
    });

    alert(library_name);
}

但仍然在控制台中說undefined

如何解決呢? 不使用參數,因為必須從其他地方調用saveFeedback函數。

.get的第二個參數在獲取完成時被調用。 您說的是,“獲取stream.txt並在完成時執行此功能”。 獲取完成后,以下調用saveFeedback:

function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
           saveFeedback();
         });
  }

由於get是異步的,因此您的解釋器將在saveFeedback success函數之前實例化saveFeedback函數(盡管某些健全性檢查器(如JSLint)可能希望您在getLibraryName之前定義saveFeedback

您應該在$ .get(data)回調中使用saveFeedback()函數,因為它是異步請求,並且您不知道何時完成。

您可以創建一個隱藏的輸入字段,並使用$ .data()將數據附加到該字段。

例如:

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           var library_name = data.toString().substring(17,data.length);
           $('#myHiddenField').data('library_name', library_name);
         });
  }

 function saveFeedback() {
    alert($('#myHiddenField').data('library_name'));
  }

jQuery get啟動一個異步調用。 異步意味着從中返回的結果將在稍后返回……可能會在很短的時間之后,可能會在幾秒鍾后返回。 啟動此呼叫后,代碼將立即進入下一行,這是您的警報。 該警報在異步調用返回之前發生,因此變量當然仍然是undefined -尚未設置。

解決問題的一種方法可能是告訴jQuery使調用同步。 但這是錯誤的答案,因為它將在調用發生時阻止瀏覽器響應用戶交互。 相反,您需要調整對異步調用的看法。 基本概念是,不必像常規的程序配方那樣具有逐步執行功能的大功能(執行步驟1,步驟2,然后步驟3),而必須設置兩個不同的配方或代碼段:一種啟動ajax調用,然后退出 ,另一種響應ajax調用的結果。

現在,您已經具有兩個功能。 由於我已經解釋的原因,您無法將它們組合在一起。 但是,您可以將它們鏈接起來,也可以將它們封裝在另一個內部:

var library_name;

function saveFeedback() {
   alert(library_name);
}

function getLibraryName(){
   jQuery.get('stream.txt', function(data) {
      library_name = data.toString().substring(17 ,data.length);
      saveFeedback(); // this chains the two functions together
   });
}

甚至更好:

var library_name;

function saveFeedback() {
   alert(library_name);
}

function receiveLibraryName(data) {
   library_name = data.toString().substring(17, data.length);
   saveFeedback();
   // additional statements here after saving
}

function getLibraryName(){
   jQuery.get('stream.txt', receiveLibraryName);
}

關鍵是您不能像往常一樣在getLibraryName函數中繼續下getLibraryName語句。 在ajax調用之后,您希望采取的步驟必須在另一個函數內部:在回調函數本身中,或者在從回調函數調用的另一個函數中。

嘗試以下代碼:

var library_name;
function getLibraryName(){
     jQuery.get('stream.txt', function(data) {
       let lbName= data.toString().substring(17,data.length);
       saveFeedback(lbName);
  });
}

function saveFeedback(lbName) {
   library_name = lbName; //If you are using library_name in other code
   alert(library_name);
}

您必須在jquery.get之前定義一次library_name。 因為如果jquery.get不起作用,則在調用警報時將不會創建library_name。 請添加var library_name; 作為saveFeedback()的第一行。

暫無
暫無

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

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