2016-07-18 9 views
5

Używam PromiseKit po prostu moje żądania API.Objc PromiseKit: Dodaj nowe obietnice w ramach obietnicy

W tym scenariuszu pobieram listę identyfikatorów obiektów z serwera. Muszę następnie pobrać szczegóły każdego ID i zwrócić tablicę szczegółów. Dość powszechny scenariusz.

Skutecznie, muszę dodać obietnice do łańcucha obietnicy z pętli FOR, która jest zawarta w PIERWSZEJ obietnicy.

Utworzyłem kod, który zaczyna dryfować w prawo, ale łańcuch kończy się, zanim zostanie zrealizowany drugi łańcuch obietnic (wypełnienie płytkich wniosków modelowych).

[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 
}); 

Czy jest lepszy sposób na robienie tego, co próbuję osiągnąć? Być może sposób na dołączenie obietnicy (.then) za pomocą przelicznika?

+0

Wystarczy popatrzeć na 'kiedy': http://promisekit.org/when/. Jestem nowy w PromiseKit, ale wygląda na to, że tego właśnie potrzebujesz. – fishinear

Odpowiedz

2

myślę chcesz 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 
}); 

Code jest PromiseKit 3.

+0

jak złapać błędy .i znaczy jak szybki [spełnij (dict), odrzuć (błąd)] – nova

+0

Nie rozumiem twojego pytania, dlaczego nie zapytać tutaj: https://gitter.im/mxcl/PromiseKit – mxcl