0

この関数を使用して、ex_id を与えたときにエクササイズの名前を返そうとしていますが、undefined が返されます。

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

戻り値はどこで得られると思いますか? returnステートメントを定義していないため、ターゲットとコールバックを使用して呼び出してから戻りますgetExerciseName$.getJSONundefined

コールバックは後で呼び出され、その戻り値は処理されないため失われます。

非同期関数について読む必要があると思います。

オプションは、promise となる実際の $.getJSON 呼び出しの結果を返し、それで何かを行うか、コールバックを渡して戻り値を関数呼び出しに処理することです。

編集: 実際には、コードにも別のバグがあります。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); });
于 2013-04-15T21:52:50.907 に答える