【发布时间】:2015-03-30 14:35:53
【问题描述】:
在 Ember 中,我有时会遇到需要检查函数是否返回 Promise 的情况。例如,如果我有一个派生的路线:
MyRoute = ParentRoute.extend({
beforeModel: function() {
this._super().then(function() {
// do something...
});
}
});
虽然 beforeModel 可以返回一个 Promise,但它可能不会。特别是,如果它是默认的 Ember.K 实现,那么它不会。我宁愿不总是这样做:
var res = this._super();
if (typeof res.then === "function") {
res.then(function() {
// do X
});
} else {
// do X
}
我认为有一种方法可以包装一些人们不知道它是否是 thenable 的东西,然后不管它是链式的。但我在文档中找不到。
上面的内容是不受欢迎的,因为它很冗长,并且需要两次 X 的代码。
想法?
更新:
我能够通过以下咖啡脚本测试确认 @torazaburo 的回应:
`import { test, module } from 'ember-qunit'`
module "testing promise behavior"
test "can cast to promise", ->
expect 3
order = []
returnsPromise = ->
new Ember.RSVP.Promise (resolve) ->
order.push 'a'
resolve('response 1')
returnsValue = ->
order.push 'b'
'response 2'
Ember.run ->
Ember.RSVP.resolve(returnsPromise()).then (response) ->
order.push 'c'
equal response, 'response 1'
Ember.RSVP.resolve(returnsValue()).then (response) ->
order.push 'd'
equal response, 'response 2'
equal order.join(' '), 'a b c d'
感谢您的解决方案!似乎 RSVP 的 Promises 实现也有一个内置的 resolve 方法,可以执行您的建议,结果与您建议的 cast 相同,尽管现在已弃用。
【问题讨论】: