2017-05-23 19 views
0

Ich versuche, eine Put-Anfrage an eine API aus Array, die ich habe. Der Post will ein Objekt, und ich habe ein Array von Objekten. Was ich mache, ist eine Schleife, die die Länge meines Arrays von Objekten angibt, die die Methode in meinen Dienst rufen. Das Problem ist, dass nur der erste funktioniert und der Rest nicht funktioniert. Soll ich etwas wie Versprechen versprechen und es dann rekursiv nennen?So rufen Sie eine Post-Methode von api in einer Schleife auf Winkel

Hier lasse ich meine Methode die api nennen:

onUpdate() { 
for (var i = 0; i < this.conditionsToUpdate.length; i++) { 
     this.ruleService.updateConditionsFromRule(this.rule.id, this.conditionsToUpdate[i]) 
    .then(_ => { 
     this.notificationService.addToast('Condition Updated!', '', 2) 
    }) 
    .catch(err => this.notificationService.handleError("Could not update the 
     condition!")) 
} 
} 

schließlich auf meinem Dienst Ich habe meine Anfrage:

updateConditionsFromRule(idRule: number, condition: ConditionUpdate):Promise<any> { 
return this.http.post(`${this.organizationId}/rules/${idRule}/conditions`, condition) 
    .toPromise() 
    .then(res => { 
    const response = <{ id: String, error: IError[] }>res.json(); 
    if (!!response && !!response.error) { 
     return Promise.reject(response.error) 
    } else { 
     return Promise.resolve(response) 
    } 
    }).catch(err => Promise.reject(err)); 
} 

Und wie gesagt, es gibt mir nur den ersten Beitrag wir tun, der Rest wird nicht geschaffen.

Vielen Dank!

Antwort

0

Sie können Observable dafür verwenden, Versprechen werden zu begrenzt sein.

gegeben Array updateConditionsFromRule, das ist, wie so etwas zu implementieren:

let requests:Observable<Response>[] = []; 
updateConditionsFromRule.forEach(updateCondition => { 
    requests.push(this.http.post(`${this.organizationId}/rules/${idRule}/conditions`, condition)); 
}); 

// After our loop, requests is an array of Observables, not triggered at the moment. 

//Now we use combineLatest to convert our Observable<Response>[] to a Observable<Response[]>. 
//This means that the promise will resolve once the last request of the array has finished. 

Observable.combineLatest(requests).toPromise() 
    .then(res => { 
    const response = <{ id: String, error: IError[] }>res.json(); 
    if (!!response && !!response.error) { 
     return Promise.reject(response.error) 
    } else { 
     return Promise.resolve(response) 
    } 
    }).catch(err => Promise.reject(err)); 
} 
Verwandte Themen