coobjc
coobjc copied to clipboard
batch_await
在NSArray *co_batch_await(NSArray * awaitableList)函数中为什么会将错误替换进result?
我的场景是使用batch_await调用好几个接口,然后拿到结果刷新页面,但是如果其中一个接口调用失败我将调用reject NSError *err = [NSError errorWithDomain:@"data error" code:-1 userInfo:nil]; [promise reject:err]; 这样,而调用batch_await之后,由于 NSError *error = co_getError(); if (error) { [result replaceObjectAtIndex:i withObject:error]; } 前面数组中得到的结果也是有error,我在结果取值result[1]的时候并没有得到想要的结果,而是error,这样再走下面的逻辑程序就会有问题,为什么不能将错误放入co_getError中, 想await中那样,最后取得错误另外处理,否则每个result[1], result[2],我都需要判断返回的结果是否有错,再走正常逻辑 NSArray *recommentArray = result[1]; if (![recommentArray isKindOfClass:[NSError class]]) { goodsObj.recommendArray = recommentArray; }
NSMutableArray *goodsColorInfo = result[2];
if (![goodsColorInfo isKindOfClass:[NSError class]]) {
[self getHuiMaiColorAndStyleInfo:goodsColorInfo];
}
这样比较繁琐
由于oc里面不能适用异常,所以error处理逻辑是比较麻烦。
在你这个场景中的确是按你说的比较方便。但是也可能存在batch并发并不因某个任务失败而全盘失败的case。 batch_await 在coobjc里面算是个util封装,你可以根据你自身的情况进行封装。
为了避免错误对正常的业务逻辑造成影响,我用元组回调了错误和正常数据,做了区分 NSMutableArray<NSError *> *errors = [NSMutableArray array]; NSError *error; co_unpack(&commentMod, &error) = result.firstObject; 多个接口的错误没有逐一展示,而是取最后一条显示,也能解决目前的问题,貌似没有什么好的解决方案了