0

この問題は、実際にはjqueryを完全に理解していないことが原因です。

複数回使用する関数に入れようとしたコードがいくつかあります。

function actors(query){
    $.get("websit.com?title=" + query + "&type=json", function(html){
        var result = html;
        var obj = eval ("(" + result + ")");
        var actor = obj[0].actors;
        return actor; //as far as im aware this does nothing
    });
    return 0; // gets here and returns zero, returning actor here returns undefined
}

アクター変数は必要な情報を保持していますが、関数から変数を取得するのに苦労しています。内部関数のために、それは実行され、return 0;

内部関数に変数を割り当てようとすると、戻り変数ではなくオブジェクトが返されます。

正しい方向への解決策や指針をいただければ幸いです。

4

4 に答える 4

4

この質問は月に1000回尋ねられます。非同期呼び出しを同期呼び出しのように動作させることはできません。それがコールバックの目的です。

jQueryも使用しているので、evalを使用する必要はありません。適切なコンテンツタイプを設定すると、データが解析されます。

コールバックの基本的な考え方

function actors(query, callback){
    $.getJSON("websit.com?title=" + query + "&type=json", function(data) {
        var actor = data[0].actors;
        callback(actor);
    });
}


function processResults(info){
    console.log(info);
}

actors("Something", processResults);
于 2013-03-04T21:11:59.517 に答える
1

それだけではできないのは事実ですが、私が遭遇したほとんどの場合、このようなものが許容できる回避策であることがわかりました。

function getMeSomeJSON(query) {    
  return $.get("websit.com?title=" + query + "&type=json");
}

これは、リクエストの応答を呼び出したものに返します。

または、次のことができます。

  • 応答をコールバックに渡します。
  • $ .ajaxをasync:falseで使用しますが、これは悪い習慣と見なされます。
于 2013-03-04T21:18:26.533 に答える
0

ドキュメントを読んでください。データ型の処理など、いくつかの例があります。そして、簡単なチェックは何を返すかを決定するのに役立つはずです。

于 2013-03-04T21:18:13.710 に答える
0

お気づきのとおり、ajax応答ハンドラーはactors関数が戻った後に実行されるため、値を返すのがかなり難しくなります。標準的な解決策は、アクター関数からpromiseを返すことです。jquery docsで、promiseまたは遅延オブジェクトについて調べることができます。

これは私の提案です:

function actors(query){
    var actorsPromise = $.Deferred();
    $.get("websit.com?title=" + query + "&type=json", function(html){
        var result = html;
        var obj = eval ("(" + result + ")");
        var actor = obj[0].actors;
        actorsPromise.resolve(actor);
    });
    return actorsPromise;
}

actors(/* your query */).done(function(actor) {
    //do whatever you need with your actor
});
于 2013-03-04T21:22:03.423 に答える