** [编辑] **我有一个for循环,它应该从上到下依次遍历循环的每个步骤,然后回到顶部并再次重复这些步骤。但是,它没有转到最后一步(这是一个函数),而是从中间返回到第一步,获取所有参数,并在完成了从上到下的所有步骤循环之后,然后转到最后一步,并多次运行该函数,但只能使用从上一步获得的最后一个参数。
我试图将最后一步(函数)放在循环之外,但是在循环中,最后一个参数将覆盖先前的参数,而该函数将仅使用最后一个参数。
用于获取产品信息并将其添加到购物车的循环代码:
fill_between
函数“ addCartItem”的代码:
@IBAction func btnReorderTapped(_ sender: UIButton) {
if !isReorderDisable {
let orderItem = orderDetail.items
func addToCart() {
viewModel.addCartItem(success: {
print("product added")
}, failure: { (errorMessage) in
self.showAlert(errorMessage)
print("fail")
})
}
var results: [CartItemData] = []
for item in orderItem {
let cartItem = CartItemData()
cartItem.sku = item.sku
cartItem.qty = item.qtyOrdered
cartItem.name = item.name
cartItem.price = item.price
results.append(cartItem)
}
for i in 0...1 { // test two sets of value in results[i]
viewModel.cartItem = results[i]
addToCart()
}
}
}
预期的打印消息应为:
/**
Add new item to existing shopping cart
*/
func addCartItem(success: @escaping () -> Void, failure: @escaping (_ errorMessage : String) -> Void) {
cart.cartItem = cartItem
cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"
if ReachabilityUtil.shareInstance.isOnline() {
beforeApiCall?()
// IF CART NOT CARTE, CRATE THE CART AND RETRY CART ITEM ADD
createCartData(success: { (_) in
self.cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"
// CHECK CART LIMIT BEFORE ADDING NEW ITEM INTO CART
self.checkCartLimit(success: { (checkLimit) in
if let limitErrors = checkLimit.limit_errors {
for limitError in limitErrors {
switch limitError.typeLimit {
case .cartItemAndTotalLimitExcced, .cartItemLimitExceed, .cartTotalLimitExceed:
failure(limitError.message)
return
default:
break
}
}
}
// ADD ITEM TO CART
CartApiManager.sharedInstance.doAddCartItem(data: self.cart.toJSON(), completed: { (apiResponseHandler, error) in
self.afterApiCall?()
// print("cartData-", self.cart)
if apiResponseHandler.isSuccess() {
// UPDATE CART DATA IN LOCAL DB
self.getCartData(success: { (_) in
}, failure: { (errorMessage) in
print("\(errorMessage)")
})
// UPDATE CART SUMMARY DATA IN LOCAL DB
self.getCartSummary(success: {
}, failure: { (errorMessage) in
print("\(errorMessage)")
})
success()
} else {
failure(apiResponseHandler.errorMessage())
}
})
}, failure: { (errorMessage) in
self.cart.cartItem?.quote_id = "\(CartInfo.getCartID() ?? 0)"
// CHECK LIMIT MAY BE FAILURE ON FIRST STAGE, SO WE ALLOWED TO ADD ITEM INTO CART
CartApiManager.sharedInstance.doAddCartItem(data: self.cart.toJSON(), completed: { (apiResponseHandler, error) in
self.afterApiCall?()
if apiResponseHandler.isSuccess() {
// UPDATE CART DATA IN LOCAL DB
self.getCartData(success: { (_) in
}, failure: { (errorMessage) in
print("\(errorMessage)")
})
// UPDATE CART SUMMARY DATA IN LOCAL DB
self.getCartSummary(success: {
}, failure: { (errorMessage) in
print("\(errorMessage)")
})
success()
} else {
failure(apiResponseHandler.errorMessage())
}
})
return
})
}, failure: { (errorMessage) in
failure(errorMessage)
})
}
}
应该在购物车中添加两个项目。但是,
实际的打印消息是:
sku- xxxxxx
final- CartItemData {
sku = xxxxxx;
qty = 1;
name = nnnnnn;
price = 100;
product_type = ;
quote_id = ;
}
cartData- CartItemData {
sku = xxxxxx;
qty = 1;
name = nnnnnn;
price = 100;
product_type = ;
quote_id = ;
}
product added
sku- yyyyyy
final- CartItemData {
sku = yyyyyy;
qty = 1;
name = mmmmmm;
price = 200;
product_type = ;
quote_id = ;
}
cartData- CartItemData {
sku = yyyyyy;
qty = 1;
name = mmmmmm;
price = 200;
product_type = ;
quote_id = ;
}
product added
所以最后添加的项目只是第二个项目。
请任何人告诉我如何将异步函数“ addCartItem”应用于数组“结果”中的每个元素?非常感谢你!
答案 0 :(得分:0)
viewModel.addCartItem
在该API调用中具有使用cartItem
模型的api调用,因此解决方案是将cartItem
传递给addCartItem
函数,如下所示:一个单独的参数。 如果将调用addCardItem函数的方式更改为:
func addCartItem(_ cartItem: CartItemData, success: @escaping () -> Void, failure: @escaping (_ errorMessage : String) -> Void) {
// here user cartItem instead of self.cartItem
}
,您应该替换以下呼叫:
viewModel.addCartItem(success: {
print("product added")
}, failure: { (errorMessage) in
self.showAlert(errorMessage)
print("fail")
})
作者:
viewModel.addCartItem(cartItem, success: {
print("product added")
}, failure: { (errorMessage) in
self.showAlert(errorMessage)
print("fail")
})