11

複数の子ビューを管理するための一般的なバックボーン ビューを構築しています。これらのビューをレンダリングする前に、これらのビューを準備するロジックを実行する必要がある場合があります。次のように、バックボーン イベントを使用して pre_render フックを有効にすることを検討しています。

view = new (this.child_view);
this.trigger('pre_render', view);
view.render();

によって呼び出されたイベントは同期的に実行されるので、行が呼び出される前にすべてのイベントtrigger()が終了することが保証されますか?render()

4

3 に答える 3

12

基本的に、はい、同期です。

ソースからの関連セクションは次のとおりです。

trigger: function(name) {
  if (!this._events) return this;
  var args = slice.call(arguments, 1);
  if (!eventsApi(this, 'trigger', name, args)) return this;
  var events = this._events[name];
  var allEvents = this._events.all;
  if (events) triggerEvents(this, events, args);
  if (allEvents) triggerEvents(this, allEvents, arguments);
  return this;
},

インポート関数はtriggerEventsで、実際にハンドラを呼び出します。コメントによると、これは単なる最適化されたディスパッチャーです。.call()これらはすべてandを呼び出していることに注意してください。その.apply()ため、呼び出し元に制御が返される前にコールバックが完了します。

var triggerEvents = function(obj, events, args) {
    var ev, i = -1, l = events.length;
    switch (args.length) {
    case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);
    return;
    case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]);
    return;
    case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]);
    return;
    case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]);
    return;
    default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
    }
};

ただし、他の人が述べたように、トリガー ハンドラーは、必要に応じて独自のコールバックを自由にスケジュールできます。したがって、ハンドラーが戻る前に作業を終了するかどうかは、ハンドラー コード自体に依存します。

于 2012-12-18T00:30:25.467 に答える
2

はい、同期しています。ただし、このイベントによってトリガーされる関数は自由に使用または ajax リクエストを作成できます。その場合、呼び出しが返されてコードが call に進むまでにsetTimeoutそれらは完了していません。はい、すべてのバインドされたイベントハンドラーが呼び出されますtriggerrenderしかし、必ずしもすべての処理が完了するとは限りません。トリガー API 自体はコールバックや promise を使用しないため、すべてのイベント ハンドラーがいつ完了するかを直接知る方法はありません。必要に応じて、そのような API を自分で実装し、非同期処理を含むすべてが完了したときに個別のイベントを発生させる必要があります。ただし、日常のプログラミングでは、これらのイベント ハンドラーのほとんどは同期的であり、そうでない場合でも、コードは通常、続行してもアプリケーションが誤動作しないように構造化されています。このコントラクトを変更する必要がある場合は、アプリケーションの設計がイベント システムを調和して使用していないというコードのにおいがするため、問題に対する別のアプローチを検討することをお勧めします。

于 2012-12-18T00:30:36.937 に答える
1

トリガーはソースコードによると同期的ですが、「pre_render」イベントをリッスンするすべての関数が同期操作を行うわけではありません。PS: ソース コードは非常に読みやすいので、実際に見てみる必要があります。

http://backbonejs.org/docs/backbone.html

于 2012-12-18T00:30:46.723 に答える