1
我目前正在调查是否应将PromiseKit集成到现有项目中。带有可选承诺的PromiseKit
我的主要问题是我需要实现一个可以调用5个Web服务的业务逻辑。其中一些被调用取决于以前的结果。
我目前的体系结构是基于分解几个函数中的代码来调用对方的闭包。
我想知道我是否可以使用PromiseKit(或其他)编写更易于管理的代码。
这里是我需要做的事情的一些伪代码:
// if true, the phone validation is skipped
let forceRequest = false
// true if a 3rd party web-service has checked the phone number
let isVerified = true
// true if the 3rd party checked the phone number and it is valid
var isValid = false
if !isVerified {
// update value from 3rd party web-service
isValid = isValidPhoneNumberPromise()
}
// If the phone no is invalid stop execution (unless forced)
if !isValid && !force {
throw MyError.error1
}
// web request to create order
createOrderPromise()
// if we have a valid phone number, first send an SMS, then update log
if isValid {
sendSmsPromise()
updateLogPromise()
}
基于totiG的答案,我想出了以下变化:
var isValid = isValid
firstly
{
return Controller.verify(isVerified: isVerified, isValid: isValid)
}
.then { _isValid -> Promise<Int> in
isValid = _isValid
return Controller.createOrder()
}
.then
{ _ -> Promise<Bool> in
if isValid {
return Controller.isSendSms()
}
return Promise (value: true)
}
.then
{ _ -> Promise<Bool> in
if isValid {
return Controller.updateLog()
}
return Promise (value: true)
}
.catch
{ error in
print (error)
}
谢谢你的帮助。嗨,我最终使用了您的代码的变体(请参阅问题编辑),请让我知道如果您看到我的方法有任何问题。 –
虽然您的代码确实有效,但您在每个函数中都检查isValid属性是否为true。承诺应该工作,以便下一步只有在前一个有效时才会执行。在我的例子中,你应该做的是在验证失败时返回一个错误(或者你可以抛出一个异常) - 这会导致catch函数运行,并且你不需要担心在其他地方检查isValid。 – totiG
问题是最后2个承诺是可选的。我只有在电话号码有效时才需要执行它们。如果我不给他们打电话,这不被视为错误。 –