0

当我给他 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 是正确的,我似乎找不到任何问题。

感谢您的帮助,谢谢。

4

2 回答 2

0

您的函数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");
        });
    }

恐怕这是您摆脱异步回调函数的唯一方法。

编辑:更改返回值

于 2013-04-15T21:49:49.350 回答
0

您期望从哪里获得返回值?getExerciseName使用目标和回调进行调用$.getJSON,然后它返回undefined,因为您尚未定义 return 语句。

稍后将调用回调,并且它的返回值会丢失,因为它没有被处理。

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

一个选项是返回实际 $.getJSON 调用的结果,这将是一个承诺,然后对其进行处理或传递一个回调以将返回值处理到函数调用中

编辑:实际上代码中还有另一个错误。if 子句将使 for 循环在第一个元素之后中断,无论它是否正确。我希望您希望代码仅在返回数组中的任何元素的测试不正确时才返回 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); });
于 2013-04-15T21:52:50.907 回答