0

を使用する関数がありますgetJSONが、期待どおりに機能しません。

function balbla(name, param) {
        $.getJSON("/blabla.json?name=" + name + "&param=" + param, function(data) {
                return data.bla;
        });
}

alert(data.bla)getJSON メソッドで使用すると機能しますが、試しreturn data.blaてみると機能しません。また、変数を作成して値を書き込もうとすると、うまくいきdata.blaません!

// 私はこれを試しました:

function getRouteData(name, param) {
    return $.getJSON('/routes_js.json', {route:name, opt: param});
}
function getRoute(name, param) {
        getRouteData(name, param).done(function(data) {
                return data.route;
        });
}

しかし、私が呼び出すgetRoute("bla", "blub")と、まだ返されますundefined

4

3 に答える 3

5

AJAX は非同期です。このような関数では、AJAX 呼び出しの結果に依存する値を簡単に返すことはできません。コールバックを受け入れるように関数を変更します。

function balbla(name, param, cb) {
    $.getJSON('/blabla.json', {name:name, param: param}, function(data) {
        cb(data.bla);
    });
}

そして、次のように使用します。

balbla('foo', 'bar', function(bla) {
    // do stuff
});

さらにクリーンな方法は、jqXHR オブジェクトを返すことです。

function balbla(name, param) {
    return $.getJSON('/blabla.json', {name:name, param: param});
}

それを呼び出すときは、jqXHR オブジェクトのdeferred/promiseインターフェイスを使用して、成功のコールバックをアタッチします。

balbla('foo', 'bar').done(function(data) {
    alert(data.bla);
});

$.ajax()同期モードでの使用は、考慮すべきオプションではないことに注意してください。リクエストが完了するまで、ブラウザの UI (または少なくともアクティブなタブ) がハングする可能性があります。それに加えて、非同期コールバックは誰もが行う方法です。

コールバック関数を使用したくない場合は、tamejsなどのプリプロセッサを使用して非同期関数を自動的に生成できます。

于 2012-05-30T13:53:20.683 に答える
3

return ステートメントを含む関数:

function(data) {
    return data.bla;
}

… はコードによって呼び出されていない (jQuery の奥深くで呼び出されている) ため、関数呼び出しの左側に代入を配置する方法がありません。

これは非同期関数の一部としても呼び出されているためbalbla、匿名関数が呼び出される前に、関数の実行が終了して返されます。

応答データで何かをしたい場合は、匿名のコールバック関数内で行います。

于 2012-05-30T13:55:45.037 に答える
2

getJSONは非同期であり、同期ではありません。コールバックを使用する必要があるため、ロジックを 2 つのステップで実行する必要があります。呼び出しステップと処理ステップ。

于 2012-05-30T13:53:44.437 に答える