Objc PromiseKit: Добавить новые обещания из обещания
Я использую PromiseKit, чтобы просто мои запросы API.
В этом сценарии я получаю список идентификаторов объектов с сервера. Мне нужно получить детали для каждого идентификатора и вернуть массив деталей. Довольно распространенный сценарий.
По сути, мне нужно добавить обещания в цепочку обещаний из цикла FOR, который содержится в обещании FIRST.
Я создал код, который начинает дрейфовать правильно, но цепочка завершается до того, как вторая цепочка обещаний (заполнить поверхностные запросы модели) может быть выполнена.
[PMKPromise promiseWithResolver:^(PMKResolver resolve) {
// Fetch an array of object IDs (shallow objects)
[APIManager fetchObjectListWithCompletion:^(NSArray *resultObjects, NSError *error) {
resolve(error ?: resultObjects[0]);
}];
}].then(^(NSArray *objects){
// Fill each shallow object (query details)
PMKPromise *fetches = [PMKPromise promiseWithValue:nil];
for(id model in objects) {
fetches.then(^{
[APIManager fillShallowObject:model withCompletion:^(NSArray *resultObjects, NSError *error) {
// resolve?
}];
});
}
// Return promise that contains all fill requests
return fetches;
})].then(^{
// This should be executed after all fill requests complete
// Instead it's executed after the initial ID array request
});
Есть ли лучший способ сделать то, что я пытаюсь сделать? Возможно, способ добавить обещание (.then) с помощью резольвера?
1 ответ
Я думаю ты хочешь when
:
[AnyPromise promiseWithAdapterBlock:^(id adapter) {
[APIManager fetchObjectListWithCompletion:adapter];
}].then(^(id objects){
NSMutableArray *promises = [NSMutableArray new];
for (id model in objects) {
id promise = [AnyPromise promiseWithAdapterBlock:^(id adapter){
[APIManager fillShallowObject:model withCompletion:adapter];
}];
[promises addObject:promise];
}
return PMKWhen(promises);
}).then(^(NSArray *results){
// when waits on all promises
});
Код - это PromiseKit 3.