2016-07-18 207 views
5

Sto usando PromiseKit semplicemente alle mie richieste API.Objc PromiseKit: aggiungi nuove promesse dall'interno di una promessa

In questo scenario, sto recuperando un elenco di ID di oggetti dal server. Devo quindi recuperare i dettagli per ciascun ID e restituire una serie di dettagli. Scenario abbastanza comune.

In effetti, ho bisogno di aggiungere promesse alla catena di promesse da un ciclo FOR che è contenuto nella PRIMA promessa.

Ho creato il codice che inizia a deviare a destra, ma la catena si completa prima che la seconda catena di promesse (riempire richieste di modelli superficiali) possa essere eseguita.

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

C'è un modo migliore per fare ciò che sto cercando di realizzare? Forse un modo per aggiungere una promessa (.) A un risolutore?

+0

Date un'occhiata al 'quando': http://promisekit.org/when/. Sono nuovo a PromiseKit, ma sembra che sia ciò di cui hai bisogno. – fishinear

risposta

2

Penso che si desidera 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 
}); 

codice è PromiseKit 3.

+0

come si captano errori. Intendo come swift [adempi (dict), reject (errore)] – nova

+0

Non capisco la tua domanda, perché non chiederlo qui: https://gitter.im/mxcl/PromiseKit – mxcl