3

以前にも尋ねられたことのように聞こえるかもしれませんが、探し求めているものに一致するものは見つかりませんでした。

私は Ajax にかなり基づいたプロジェクトに取り組んでいます。私は jQuery を使用していますが、その美しく合理化されたコードを使用しても、dataフィールドを通過する 1 つのコマンドを除いて、コードがまったく同じであるという点に到達すると、まだ厄介です。

そこで、次のようにハンドラー関数内に設定してみました。

function _call(task, opts, async) {
    if(typeof async !== "boolean") { async = true; }
    opts = $.extend({}, opts, options);
    $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        async:async,
        data: { task: task, opts: opts }
    }).done(function(data) { return data; });
}

読み通せば options、この例では定義されていない var があることに気付くでしょう。実際には割り当てられていますが、わかりやすくするために省略されています。

async: falseに設定されていても、 の呼び出し後もコードが続行されるため、結果が間に合わないため、これが機能しないことに気付き_call(...)ました。匿名関数をハンドラーに渡し、それを関数として使用するなど、いくつかの異なるバリエーションを試しましたが、.done()外部変数と相互作用せず、目的が無効になります。

私が探しているのは、次のように使用できるシステムだけです。

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});

これが可能になることを本当に願っています。関数の主な目的は、不必要に繰り返されるコードの必要性を取り除くことであるため、そうなると確信しています。

ありがとう。:)

4

5 に答える 5

1

あなたはおそらくこれを行うのが最善です

function _call(task, opts, callback) {
    opts = $.extend({}, opts, options);

    $.ajax({
        url: "myphpfile.php",
        dataType:"JSON",
        type:"POST",
        data: { task: task, opts: opts }
    }).done(function(data) { callback(data); });
}

このように使う

_call("thisisanothertask", {'option': 'option1'}, function(data) {
   //do things with data
});

_call は、応答を得るのに時間がかかる可能性があるため、すぐに戻ることができないため、実際にはこれを行うことはできません。

var returnedData = _call("thisismytask");
var returnedDataWithOptions = _call("thisisanothertask", {'option': 'option1'});

次のように使用する必要があります。

_call("thisismytask", null, function(returnedData) {
   //use returnData
});

_call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
  //use returnedDataWithOptions
});

thisisanothertask の前に thisismytask の結果が必要な場合は、次のようにする必要があります。

_call("thisismytask", null, function(returnedData) {

   _call("thisisanothertask", {'option': 'option1'}, function(returnedDataWithOptions) {
     //use returnData

     //use returnedDataWithOptions
   });

});
于 2013-09-11T13:40:18.263 に答える