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.

Другие вопросы по тегам