我试图编写一个返回promise的函数:
func sample() -> Promise<AnyObject> {
return Promise(1)
.then { _ -> Void in
debugPrint("foo")
}.then { _ -> Void in
debugPrint("foo")
}
}
我在最后一句话中收到错误:
Declared closure result 'Void' (aka '()') is incompatible with contextual type 'AnyPromise'
我的印象是&#39;然后&#39;无论如何应该隐含地回复承诺;我的想法错了吗?我应该像这样明确地返回一个承诺吗?:
func sample() -> Promise<AnyObject> {
return Promise(1)
.then { _ -> Void in
debugPrint("foo")
}.then { _ -> Promise<AnyObject> in
debugPrint("foo")
return Promise(1)
}
}
由于
答案 0 :(得分:3)
then(_:)
返回的promise与闭包的返回值匹配。
func sample() -> Promise<AnyObject> {
return Promise(1)
.then { _ -> Void in
debugPrint("foo")
}.then { _ -> Void in
debugPrint("foo")
}
}
让我重新修改你的方法。
func sample() -> Promise<AnyObject> {
let p1: Promise<AnyObject> = Promise(1)
let p2: Promise<Void> = p1.then { _ -> Void in
debugPrint("foo")
}
let p3: Promise<Void> = p2.then { _ -> Void in
debugPrint("foo")
}
return p3
}
您现在可以看到Promise<AnyObject>
的预期回复类型与Promise<Void>
的实际回复类型不符。
如果您希望方法返回Promise<AnyObject>
,则承诺链中的最后一个承诺必须返回AnyObject
。
func sample() -> Promise<AnyObject> {
return firstly { _ -> Void in
debugPrint("foo")
}.then { _ -> Void in
debugPrint("foo")
}.then { _ -> AnyObject in
1
}
}
答案 1 :(得分:2)
then
来电会在您的第一个示例中返回您在其通话中指定的内容,Void
。
对于您的第二次尝试,您已经离我更近了,但是您已经返回了一个不相关的Promise
,您必须第二次与1
一起完成。
请尝试使用此代码:
func sample() -> Promise<AnyObject> {
return Promise<AnyObject> { fulfill, reject in
return Promise<AnyObject>(1)
.then { _ -> Void in
debugPrint("foo")
}.then { _ -> Void in
debugPrint("foo")
}
}
}
这会将第二个Promise
嵌入到第一个中,所以现在您的then
将按顺序运行,以及您添加到函数返回的承诺时的任何其他getResourceAsStream()
&# 39; s在你的代码中的其他地方调用。