1

我有一个函数用于从文本文件中获取数据并在另一个函数中提醒它。

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

但它仍然在控制台中一直说未定义

如何解决这个问题?不使用参数,因为必须从其他地方调用 saveFeedback 函数。

4

6 回答 6

0

您应该在 $.get(data) 回调中使用 saveFeedback() 函数,因为它是异步请求并且您不知道何时完成。

于 2012-12-10T08:32:14.820 回答
0

.getget 完成时调用第二个参数 to 。您是说“获取stream.txt并在完成后执行此功能”。获取完成后,以下调用 saveFeedback:

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

因为 get 是异步的,所以您的解释器将在saveFeedback调用函数之前实例化该函数success(尽管一些像 JSLint 这样的健全性检查器可能希望您在saveFeedback之前定义getLibraryName.

于 2012-12-10T08:28:27.677 回答
0

您可以使用 $.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'));
  }
于 2012-12-10T08:36:53.810 回答
0

jQueryget发起一个异步调用。异步意味着它的结果将稍后返回……可能会在很短的时间后返回,也可能会在几秒后返回。启动此调用后,代码将立即进入下一行,即您的警报。这个警报发生在异步调用返回之前,所以当然变量仍然是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函数中继续下一个语句。您希望在 ajax 调用之后执行的步骤必须在另一个函数中:在回调函数本身中,或者在从回调函数调用的另一个函数中。

于 2012-12-10T08:41:12.853 回答
0

试试下面的代码:

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);
}
于 2018-01-22T06:06:42.150 回答
-2

您必须在 jquery.get 之前定义 library_name 一次。因为如果 jquery.get 不起作用 library_name 将不会在您调用警报时创建。请添加 var library_name; 作为 saveFeedback() 的第一行。

于 2012-12-10T08:28:20.963 回答