gpt4 book ai didi

ios - 轮询异步任务,然后等待 1 次成功或所有响应都被拒绝

转载 作者:行者123 更新时间:2023-11-28 06:19:42 25 4
gpt4 key购买 nike

PromiseKit 版本:4.0

Xcode 版本:8.3.2

我最近开始使用 PromiseKit。

实际上,我正在创建一个轮询 HTTP 请求,它返回“已完成”或“未完成”。

我必须在每 1 秒后继续进行 HTTP 调用,持续时间为 5 秒。

我需要实现的是,如果任何 1 个调用给我完成状态,我将返回 fulfilled("completed")。但是如果我所有的请求都给我一个“notCompleted”的响应,我需要返回 reject(“notCompleted”)

return Promise<T> { fulfilled, reject
let timer1 = Timer.scheduledTimer(withTimeInterval: TimeInterval(1), repeats: true) { timer in
pArr.append(Promise<T> { f, r in

doSomeAsyncTask { T in
if success {
f(T)
fulfilled(T)
timer.invalidate()
} else {
r(ErrorNotCompleted)
}
}

// timeout option
_ = after(interval: TimeInterval(15)).then(execute: { () -> Void in
reject(timeoutForConfirmation)
})
})
}


Timer.scheduledTimer(withTimeInterval: TimeInterval(5), repeats: false) { timer in
timer1.invalidate()
timer.invalidate()
when(resolved: pArr).then { results in
let count = results.filter({ result -> Bool in
return result.boolValue
}).count

if count == 0 {
// TODO: then reject here
reject(ErrorNotCompleted)
}

}.catch { error in
print(error)
}
}

}
timer1.fire()

我怎样才能做到这一点?

在PromiseKit中有没有更好的方式来写上面的代码。

最佳答案

这是一种使用 Promises 进行基本循环的方法...来 self 的要点:https://gist.github.com/dtartaglia/2b19e59beaf480535596

我认为您需要做的就是确保您的 promise 生产者 (body) 在进行网络调用之前有适当的延迟。

/**
Repeadetly evaluates a promise producer until a value satisfies the predicate.
`promiseWhile` produces a promise with the supplied `producer` and then waits
for it to resolve. If the resolved value satifies the predicate then the
returned promise will fulfill. Otherwise, it will produce a new promise. The
method continues to do this until the predicate is satisfied or an error occurs.
- Returns: A promise that is guaranteed to fulfill with a value that satisfies
the predicate, or reject.
*/

func promiseWhile<T>(pred: (T) -> Bool, body: () -> Promise<T>, fail: (() -> Promise<Void>)? = nil) -> Promise<T> {
return Promise { fulfill, reject in
func loop() {
body().then { (t) -> Void in
if !pred(t) { fulfill(t) }
else {
if let fail = fail {
fail().then { loop() }
.error { reject($0) }
}
else { loop() }
}
}
.error { reject($0) }
}
loop()
}
}

关于ios - 轮询异步任务,然后等待 1 次成功或所有响应都被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44024698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com