2017-12-15 4 views
4

Ich habe einen asynchronen Code, den ich synchron in einem meiner Knoten js Skript ausführen möchte, aber dies wartet nicht auf den Code-Block zu vervollständigen und löst das leere Objekt - DiesePromise wartet nicht auf eine for-Schleife zum Abschluss

new Promise((resolve, reject) => { 
if (object.email !== undefined) { 
    for (let i = 0; i <= object.email.length; i++) { 
     let emailObject = object.email[i] 
     if (emailObject !== undefined) { 
      this.isEmailUnsubscribed(emailObject, options).then(result => { 
       console.log('>> isEmailUnsubscribed result in send email notification: ' + result) 
       if (!result) { 
        emailObjects.push(emailObject.EmailID) 
       } 
      }) 
     } 
    } 
    console.log('emailObjects') 
    console.log(emailObjects) 
    resolve(emailObjects) 
} 
}).then(emailObjects => { 
    object.email = emailObjects 
    console.log('Email Objects from rules.evaluate') 
    console.log(emailObjects) // At this point my object is always empty. 
    this.sendEmailToSelectedUsers(object, options) 
}) 
+0

Warum sollte es warten ? Sie "lösen" es sofort und ignorieren alle Versprechen, die in der Schleife entstehen. – Bergi

Antwort

7

ist, weil Ihre Schleife neue Versprechungen zu erzeugen, die asycnoursly aufgelöst werden, verwenden Promise.all, wenn Sie mehrere Versprechen laufen müssen:

zum Beispiel:

if (object.email !== undefined) { 
    return Promise.all(object.email.map(emailObject => { 
     if(emailObject){ 
      return this.isEmailUnsubscribed(emailObject, options) 
     }else{ 
      return Promise.resolve() 
     } 
    })) 
    .then(emailObjects => { 
     object.email = emailObjects 
     console.log('Email Objects from rules.evaluate') 
     console.log(emailObjects) // At this point my object is always empty. 
     this.sendEmailToSelectedUsers(object, options) 
    }) 
} 
Verwandte Themen