2016-11-08 3 views
1

Я использую Javascript/Typcript для форматирования значения password в коллекции объектов PersonModel. Я выполняю команду Promise для каждого элемента коллекции.Javascript Promise.all confusion

Я использую Promise.all, чтобы все обещания заполнились, а затем хотите вернуть отформатированную коллекцию.

Однако во время сборки я получаю сообщение об ошибке.

PersonService.ts

private decryptPersons(persons: PersonModel[]): Promise<PersonModel[]> { 
    return new Promise<PersonModel[]>(resolve => { 
     let promises: Array<Promise<string>> = []; 
     let decryptedPersons: PersonModel[] = []; 
     for (let i: number = 0; i < persons.length; i++) { 
      let ciphertext: string = persons[i].password; 
      promises.push(this.decrypt(ciphertext).then((password: string) => { // <== line 357 
       persons[i].password = password; 
       decryptedPersons.push(persons[i]); 
      })); 
     } 
     Promise.all(promises).then(() => { 
      resolve(decryptedPersons); 
     }); 
    }); 
} 

private decrypt(value: string): Promise<string> { 
    return new Promise<string>(resolve => { 
     this.encrypter.decrypt(value).then((result: string) => { 
      resolve(result); 
     }); 
    }); 
} 

Ошибка

ERROR in ./app/pages/service/personService.ts 
(357,31): error TS2345: Argument of type 'Promise<void>' is not assignable to parameter of type 'Promise<string>'. 
    Type 'void' is not assignable to type 'string'. 

Я не эксперт Javascript, поэтому моя структура может меня неправильно. Если кто-нибудь может посоветовать, я был бы признателен.

ответ

0

Вы пытаетесь push следующее в ваш promises массив:

this.decrypt(ciphertext).then((password: string) => { // <== line 357 
    persons[i].password = password; 
    decryptedPersons.push(persons[i]); 
}) 

но ваша функция здесь не возвращает ничего, так что это будет вычисляться в Promise<void>.

Вы также злоупотребляете «явным обещанием строительства антипаттерн» в нескольких местах здесь.

Дайте этому попытку:

private decryptPersons(persons: PersonModel[]): Promise<PersonModel[]> { 
    return Promise.all(persons.map(person => 
     this.decrypt(person.password) 
      .then(password => { 
       person.password = password; 
       return person; 
      }); 
    )); 
} 

private decrypt(value: string): Promise<string> { 
    return this.encrypter.decrypt(value); 
} 
+0

спасибо. Я дам ему попробовать – Richard