2012-06-17 8 views
9

コードでこのパターンを見ることに支えられていますが、googleやSO、strangeでそのパターンを参照できませんでした。誰かがthis.async()関数の参照先を教えてもらえますか?JavaScriptでthis.async()は何をしますか

var done = this.async(); 
    // ... 
    $.get(path, function(contents) { // or some other function with callback 
    // ... 
    done(JST[path] = tmpl); 
    }) 
+7

これは組み込み関数ではありません。いくつかのライブラリ/フレームワークによって提供されなければなりません。 – user123444555621

答えて

1

これは、コールバック内でエスケープthisの問題を回避するための方法です。この余分な参照がなければ、コードは次のようになります。

$.get(path, function(contents) { // or some other function with callback 
    //Wrong! `this` might no longer point to your object 
    this.done(JST[path] = tmpl); 
}) 

残念ながら! this内部応答コールバックは、thisと同じではありません。実際には、$.get(コールバックを使用して呼び出す)がそれを決定するものに応じて、何でもかまいません。人々のほとんどは、同じ目的のためにthatという名前の余分な参照を使用します。

var that = this; 
// ... 
$.get(path, function(contents) { // or some other function with callback 
    // ... 
    that.async(JST[path] = tmpl); 
}) 

このパターンはまた、合理的かつ読みやすいようです。

ああ、あなたは、この構文について興味がある場合:

done(JST[path] = tmpl) 

これは式として使わ割り当てです。割り当ての値が右側であるので、このコードは以下と等価である:

JST[path] = tmpl; 
done(tmpl); 
+4

-1:これは 'this.async()'に関する質問に答えず、代わりに質問に出てこない何かについて話します。 @トニーがなぜこの答えを受け入れたのか、私は困惑している。 – fluffy

16

var done = this.async()done(blah)同期関数内の非同期呼び出し(例えば$.get)からフェッチされた値を返すように巧妙なトリックです。

は例を見てみましょう:

var getText = function() { 
    return "hello"; 
}; 
var text = getText(); 

それはありませんので、パズル、ここで非常に簡単関数呼び出しです。ただし、getText()関数でテキストを非同期に取得する必要がある場合はどうすればよいですか?

var getText = function() { 
    return $.get('<some-url>', function(text) { 
    return text; 
    }); // ?????? 
}; 

getText()への呼び出しは、あなたが取得したいテキストを返しません。 jqueryの約束オブジェクトを返します。

どうすればgetText()$.get()から返されるテキストを返しますか?

var getText = function() { 
    var done = this.async(); 
    $.get('<some-url>', function(text) { 
    done(text); 
    }); 
}; 
var text = getText(); // you get the expected text 

マジック、右?

this.async()の内部動作がわかりません。ライブラリがその機能を提供しているかどうかはわかりませんが、Backbone.LayoutManagerがこのトリックhttps://github.com/tbranyen/backbone.layoutmanager/blob/master/backbone.layoutmanager.js(this.asyncを検索)を使用していることがわかります。

また、Tim Branyen(バックボーンレイアウトマネージャーの作者)は、ビデオチュートリアル(http://vimeo.com/32765088 14:00 - 15:00)で簡単に説明しています。ビデオでは、TimはBen Almanがそのトリックを思いついたと言います。これも見てくださいhttps://github.com/cowboy/javascript-sync-async-foreach

私は、非同期機能と同期機能を混在させるのはかなりきちんとしたトリックだと思います。

乾杯、

+0

私はYeoman 'Creating a generator'チュートリアル(http://yeoman.io/authoring/user-interactions.html)でこれを見つけました。 – devboell

関連する問題