0

tornado にはgen、次のような構造を記述できるモジュールがあります。

def my_async_function(callback): 
    return callback(1)

@gen.engine 
def get(self): 
    result = yield gen.Task(my_async_function) #Calls async function and puts result into result variable 
    self.write(result) #Outputs result

jqueryまたは他のJavaScriptライブラリに同じ構文シュガーがありますか?

私はこのようなものが欲しい:

function get_remote_variable(name) { 
    val = $.sweetget('/remote/url/', {}); //sweetget automatically gets callback which passes data to val
    return val
}
4

2 に答える 2

1

関数を「my_async_function」と説明していますが、その使用方法は非同期ではなく同期です。

サンプル コードにはブロッキングが必要です。「my_async_function」が本当に非同期 (非ブロッキング) の場合、self.write(result)「my_async_function」を呼び出した直後に次のコード行が実行されます。関数が値を返すのに少しでも時間がかかる場合 (つまり、任意の)、最終的に何がself.write(result)書き込まれるでしょうか? つまり、値self.write(result)が設定される前に is が実行されるresultと、期待した結果が得られません。したがって、「my_async_function」はブロックする必要があり、先に進む前に戻り値を待つ必要があるため、非同期ではありません。

具体的には、あなたの質問に$.sweetget('/remote/url/', {}):それを達成するには、ajaxリクエスト(本質的に非同期であり、最初のAをAJAXに入れる)が何かを返すまでブロックできる必要があります。

sweetgetXHR の状態が変化するまでの戻りを遅らせることで同期呼び出しをハッキングできますが、whileループ (または同様のもの) を使用して、ブラウザーの UI スレッドをブロックしたり、それらの 1 つをオフにしたりするリスクがあります。長い」警告。Javascript はスレッド制御を提供しません。現在のスレッドが待機中であると指定することはできないので、先に進んで、しばらく他のことをしてください。タイムアウトのしきい値を手動でテストすることで、これにも対処できます。

なぜコールバックを使用しないのか? どのようにスライスしても、Javascript はシングルスレッドです。いいえsleep、いいえthread.sleep。これは、同期コードが UI をブロックすることを意味します。

sweetgetここでは、大まかにどのように見えるかをモックアップしました。ご覧のとおり、ブラウザー スレッドは、実行がそのタイトwhileループに入るとすぐにロックされます。実際、私のコンピューターでは、ブラウザが応答しないスクリプト ダイアログを表示するまで、ajax リクエストは起動しません。

// warning: this code WILL lock your browser!
var sweetget = function (url, time_out) {
    var completed = false;
    var result = null;
    var run_time = false;
    if (time_out)
        run_time = new Date().getTime();

    $.ajax({
        url: url,
        success: function(data) {
            result = data;
            completed = true;
        },
        error: function () {
           completed = true;
        }
    });                    // <---- that AJAX request was non-blocking

    while (!completed) {  // <------ but this while loop will block
        if (time_out) {
            if (time_out>= run_time)
                break;
            run_time = new Date().getTime();
        }
    }
    return result;
};

var t = sweetget('/echo/json/');
console.log('here is t: ', t);

試してみてください: http://jsfiddle.net/AjRy6/

于 2012-08-06T18:09:22.587 に答える
1

1.8 より前のバージョンの jQueryは、設定による同期 ajax 呼び出しをasync: falseサポートします。これは制限付きのハック (クロスドメインや jsonp なし、ブラウザーをロックアップする) であり、可能であれば避けたいと思います。

Javascript での非同期操作用のシンタックス シュガーを提供する利用可能なライブラリがいくつかあります。例えば:

...しかし、あなたが探している同期構文を提供するものは何もないと思います.JavaScriptがブラウザで動作する方法のために、常にコールバックが関係しています.

于 2012-08-06T17:43:08.420 に答える