2016-12-21 7 views
2

I`m получать бесконечный цикл, когда я пытаюсь связать функцию асинхронной так:Угловое 2 - Бесконечная петля в асинхронном трубе

<tr *ngFor="let i of items"> 
    <td>{{myAsyncFunc(i) | async}}</td> 
</tr> 

это функция:

private myAsyncFunc(i: string): Promise<string> { 
     return Promise.resolve("some"); 
} 

Я что-то не так? Или это ошибка?

ответ

7

Вы возвращаете новое обещание от myAsyncFunc(i: string) на каждый звонок, поэтому вы получаете «бесконечный цикл». Попробуйте вернуть тот же экземпляр Promise ;-)

«Бесконечная петля» на самом деле не является традиционным бесконечным циклом, а скорее побочным эффектом трубы async, запускающей цикл обнаружения изменений, когда решается его ввод Promise. В этом новом цикле обнаружения изменений угловой вызовет myAsyncFunc(i: string) и получит новое обещание наблюдать, которое затем разрешает все это начинается снова.

+0

Спасибо за ответ ... Так что я должен установить экземпляр Promise для каждого элемента? Или как я возвращаю тот же самый экземпляр? –

+0

Вам нужно будет либо кэшировать обещание для каждого i (например, в объекте карты), либо просто приложить обещание самому себе (лично мне нравится иметь выделенные модели просмотра). –

0

Вы можете проверить мой BlogPost на этой конкретной теме, когда он поражает наш проект потребляющих 5gb од браузера RAM :)
Это here

Простейший способ излечить эту проблему (как уже упоминалось) не используют функция возвращает обещание прямо в шаблоне: {{ getPromise(id) | async }}, но сохраните это обещание в контроллере (.ts файл) и обратитесь к нему в поле зрения.
Кроме того, это можно исправить, изменив настройки обнаружения изменений на push-pull, но, на мой взгляд, это приносит больше зла, чем пользы.