PromiseKit 3.0:使用循环链接
PromiseKit 3.0: chaining with loops
我正在使用 promisekit 3.0 以干净的方式帮助链接 alamofire 回调。 objective 是从网络调用开始,并承诺 return 一个 url 数组。
然后,我希望对尽可能多的这些 url 执行网络调用,以找到我正在寻找的下一个 link。一旦找到这个link,我就可以将它传递给下一步。
这部分是我卡住的地方。
我可以在数组中选择一个我知道有我想要的索引的任意索引,但是在正确的信息被 returned 之前,我无法弄清楚循环以使其继续运行。
我尝试从这个 obj-c 示例中学习,但我无法在 swift 中使用它。
他是我所做工作的一个更具体的例子。
Network.sharedInstance.makeFirstPromise(.GET, url: NSURL(string: fullSourceLink)! )
.then { (idArray) -> Promise<AnyObject> in
let ids = idArray as! [String]
//how do i do that in swift? (from the example SO answer)
//PMKPromise *p = [PMKPromise promiseWithValue: nil]; // create empty promise
//only thing i could do was feed it the first value
var p:Promise<AnyObject> = Network.sharedInstance.makePromiseRequestHostLink(.POST, id: ids[0])
//var to hold my eventual promise value, doesn't really work unless i set it to something first
var goodValue:Promise<AnyObject>
for item in ids {
//use continue to offset the promise from before the loop started
continue
//hard part
p = p.then{ returnValue -> Promise<AnyObject> in
//need a way to check if what i get is what i wanted then we can break the loop and move on
if returnValue = "whatIwant" {
goodvalue = returnValue
break
//or else we try again with the next on the list
}else {
return Network.sharedInstance.makeLoopingPromise(.POST, id: item)
}
}
}
return goodValue
}.then { (finalLink) -> Void in
//do stuck with finalLink
}
有人可以告诉我如何正确构建它吗?
是否要避免嵌套 promise 这样的反模式?在那种情况下,最好的方法是什么。
我终于通过结合您的 post 和您 post 编辑的 link 解决了这个问题。它有效,但如果有人对适当的解决方案提出意见,我将很高兴。
func download(arrayOfObjects: [Object]) -> Promise<AnyObject> {
// This stopped the compiler from complaining
var promise : Promise<AnyObject> = Promise<AnyObject>("emptyPromise")
for object in arrayOfObjects {
promise = promise.then { _ in
return Promise { fulfill, reject in
Service.getData(stuff: object.stuff completion: { success, data in
if success {
print("Got the data")
}
fulfill(successful)
})
}
}
}
return promise
}
我唯一没有做的是在此示例中显示的是保留接收到的数据,但我假设您可以使用现在的结果数组来做到这一点。
解决我的特定问题的关键是使用 "when" 函数。它一直持续到您输入的所有呼叫都完成为止。地图使查看(并在脑海中思考)变得更容易
}.then { (idArray) -> Void in
when(idArray.map({Network.sharedInstance.makePromiseRequest(.POST, params: ["thing":[=10=]])})).then{ link -> Promise<String> in
return Promise { fulfill, reject in
let stringLink:[String] = link as! [String]
for entry in stringLink {
if entry != "" {
fulfill(entry)
break
}
}
}
}.then {
}
}
我正在使用 promisekit 3.0 以干净的方式帮助链接 alamofire 回调。 objective 是从网络调用开始,并承诺 return 一个 url 数组。
然后,我希望对尽可能多的这些 url 执行网络调用,以找到我正在寻找的下一个 link。一旦找到这个link,我就可以将它传递给下一步。
这部分是我卡住的地方。
我可以在数组中选择一个我知道有我想要的索引的任意索引,但是在正确的信息被 returned 之前,我无法弄清楚循环以使其继续运行。
我尝试从这个 obj-c 示例中学习,但我无法在 swift 中使用它。
他是我所做工作的一个更具体的例子。
Network.sharedInstance.makeFirstPromise(.GET, url: NSURL(string: fullSourceLink)! )
.then { (idArray) -> Promise<AnyObject> in
let ids = idArray as! [String]
//how do i do that in swift? (from the example SO answer)
//PMKPromise *p = [PMKPromise promiseWithValue: nil]; // create empty promise
//only thing i could do was feed it the first value
var p:Promise<AnyObject> = Network.sharedInstance.makePromiseRequestHostLink(.POST, id: ids[0])
//var to hold my eventual promise value, doesn't really work unless i set it to something first
var goodValue:Promise<AnyObject>
for item in ids {
//use continue to offset the promise from before the loop started
continue
//hard part
p = p.then{ returnValue -> Promise<AnyObject> in
//need a way to check if what i get is what i wanted then we can break the loop and move on
if returnValue = "whatIwant" {
goodvalue = returnValue
break
//or else we try again with the next on the list
}else {
return Network.sharedInstance.makeLoopingPromise(.POST, id: item)
}
}
}
return goodValue
}.then { (finalLink) -> Void in
//do stuck with finalLink
}
有人可以告诉我如何正确构建它吗?
是否要避免嵌套 promise 这样的反模式?在那种情况下,最好的方法是什么。
我终于通过结合您的 post 和您 post 编辑的 link 解决了这个问题。它有效,但如果有人对适当的解决方案提出意见,我将很高兴。
func download(arrayOfObjects: [Object]) -> Promise<AnyObject> {
// This stopped the compiler from complaining
var promise : Promise<AnyObject> = Promise<AnyObject>("emptyPromise")
for object in arrayOfObjects {
promise = promise.then { _ in
return Promise { fulfill, reject in
Service.getData(stuff: object.stuff completion: { success, data in
if success {
print("Got the data")
}
fulfill(successful)
})
}
}
}
return promise
}
我唯一没有做的是在此示例中显示的是保留接收到的数据,但我假设您可以使用现在的结果数组来做到这一点。
解决我的特定问题的关键是使用 "when" 函数。它一直持续到您输入的所有呼叫都完成为止。地图使查看(并在脑海中思考)变得更容易
}.then { (idArray) -> Void in
when(idArray.map({Network.sharedInstance.makePromiseRequest(.POST, params: ["thing":[=10=]])})).then{ link -> Promise<String> in
return Promise { fulfill, reject in
let stringLink:[String] = link as! [String]
for entry in stringLink {
if entry != "" {
fulfill(entry)
break
}
}
}
}.then {
}
}