jquery移动函数从JSON返回未识别

jquery移动函数从JSON返回未识别,jquery,json,function,mobile,Jquery,Json,Function,Mobile,当我给他ex_id时,我试图使用这个函数返回一个练习的名称,但它只返回未定义的 function getExerciseName(ex_id){ $.getJSON('db.json', function(data_ex) { for (var i in data_ex.exercises) { if(data_ex.exercises[i].id == ex_id) {

当我给他ex_id时,我试图使用这个函数返回一个练习的名称,但它只返回未定义的

function getExerciseName(ex_id){
        $.getJSON('db.json', function(data_ex) {
            for (var i in data_ex.exercises) {
                if(data_ex.exercises[i].id == ex_id)
                {
                    return data_ex.exercises[i].name;        
                } else { 
                    return 'failure'
                }
            }
        });
    }
ex_id是正确的,我似乎没有发现任何问题


非常感谢您的帮助。

您的函数
getExerciseName
不会返回任何内容。它调用具有回调函数的函数
$.getJSON
。回调函数在
getJSON
末尾被异步调用。无法从异步函数中返回同步结果

我建议你试试这样:

function getExerciseName(ex_id){
        $.getJSON('db.json', function(data_ex) {
            for (var i in data_ex.exercises) {
                if(data_ex.exercises[i].id == ex_id)
                {
                    return dosomethingWithExerciseName(data_ex.exercises[i].name);
                }
            }
            alert("failure");
        });
    }
恐怕这是退出异步回调函数的唯一方法


编辑:更改返回值

您希望从何处获取返回值
getExerciseName
调用带有目标和回调的
$.getJSON
,然后返回
undefined
,因为您尚未定义return语句

回调将在稍后调用,其返回值将丢失,因为它未被处理

我认为您需要仔细阅读异步函数

一个选项是返回实际的$.getJSON调用的结果,这将是一个承诺,然后对此执行一些操作,或者传递一个回调来处理函数调用中的返回值

编辑: 实际上,代码中还有另一个bug。if子句将使for循环在第一个元素之后中断,不管它是否正确。如果返回的数组中的任何元素的测试都不是true,那么我希望代码只返回false

请尝试以下方法:

function getExerciseName(ex_id, callback){
   $.getJSON('db.json', function(data_ex) {
      for (var i in data_ex.exercises) {
         if(data_ex.exercises[i].id == ex_id) {
            return callback(data_ex.exercises[i].name);        
         }
      }
      callback('failure');
   });
}

// and call it with something like this
getExerciseName(2, function(data) { console.log(data); });

实际返回的JSON字符串是什么?它返回“failure”,我可以在firebug上查看。嗯,我明白了。我正在学习javascript和jquery,因为我正在尝试开发一些东西。。这些英语术语对我来说越来越难理解,因为它不是我的主要语言。我怎样才能避开这个问题?并进一步了解什么是同步函数和非同步函数?要理解为什么没有其他选项,您需要将回调函数视为将来某个时候调用的函数。它不会在
getExerciseName
的线程中调用,该线程在
getJSON
启动后立即完成。
JSON
可能需要时间才能到达,因此javascript使用异步调用。把它想象成两个不同的线程,主要的问题是你不返回任何东西,不管同步和异步是什么。由于getJSON不返回您定义的函数的结果,因此无法从中提取值,因此内部函数的返回值将丢失。您需要找到另一种方法来获取信息(参见我的建议)。我尝试了您的建议,创建了一个函数,该函数接收练习名称并将其存储到一个变量中,但仍然只收到了警报。看起来它在比较中失败了可能吗?这会很奇怪,因为我以前使用过相同的for and if,并且没有问题,而且我确信与exu id的比较确实存在于db.json exercise.idYou可能想从for loopWell中去掉else,奇怪的是返回在页面上显示为“未识别”,但是控制台输出似乎是正确的。返回哪个?我将返回保留在if子句中,只是为了打破for循环。在任何情况下都没有实际返回任何相关内容。return语句只从匿名内部函数返回,而不是从getExerciseName返回。将回调函数视为告诉计算机在返回答案后要做什么。计算机不会停下来等待答案,它只会记住得到答案后应该做什么。因此getExerciseName向api发送一个调用,并说当您完成此操作时,请使用结果执行此操作。然后它继续运行,发现它没有其他事情要做,返回未定义。在某个时候,一个答案回来了,计算机用这个答案调用回调函数,我指的是在页面上调用时函数的返回。控制台显示我正在查找的值,但页面显示的值与控制台不同,这是怎么回事?如果您使用的是我的示例代码,那么请注意,我在调用中放置了一个回调函数,该函数将在上面代码中If子句的匿名函数中调用,在该回调中,我调用
console.log
,其结果将数据记录到控制台。getExerciseName函数的实际调用将返回undefined,因此这取决于您如何使用该函数