【发布时间】:2025-11-23 02:00:01
【问题描述】:
B = require 'backbone'
U = require 'underscore'
o = {}
U.extend o, B.Events
o.on 'e', console.log
setTimeout o.trigger, 5000, 'e', 'Hi!'
为什么Nodejs 控制台没有记录上述延迟的主干#trigger?
@编辑
Q = require 'q'
d = Q.defer()
d.promise.then console.log
setTimeout d.resolve, 5000, 'Hi!'
这完美无缺。但是如果Q#resolve被包裹在下面的匿名函数中,为什么控制台不记录呢,
setTimeout (-> d.resolve 'Hi!'), 5000
@编辑 2
实际上,包装版本 Q #resolve 如果第一次被调用也可以工作。
为什么普通版 Q #resolve 有效,而 Backbone #trigger 无效,这是唯一剩下的问题。
@编辑 3
R = require 'rx'
src = new R.BehaviorSubject 0
dst = src.map (v) -> v + 1
dst.subscribe console.log
setTimeout src.onNext, 5000, 1
Rx #onNext 与 Backbone #trigger 有类似的问题和解决方案。
以上所有内容都可以来自不同的this 上下文,例如裸版显示以下问题,
o =
f: ->
g: -> @f()
setTimeout o.g
那么,
TypeError: Object [object Object] has no method 'f'
下面的包装版本就这样通过了。
setTimeout -> o.g()
下面显示this上下文切换导致问题和包装器解决它,
f = (g) -> g.apply @
o =
x: 'Hi!'
g: -> console.log @x
f o.g # undefined
f -> o.g() # 'Hi!'
@编辑 4
此外,Coffeescript => 绑定到 this 变化为下面的 ->,
x = 'Hi!'
o = f: => @x
console.log o.f() # Hi!
console.log -> o.f() # undefined
【问题讨论】:
标签: javascript backbone.js coffeescript q rxjs