Как перебрать результаты внутри then () и вызвать другие цепочки then () внутри цикла - PullRequest
1 голос
/ 28 мая 2019

Я не могу найти какую-либо документацию или пример в машинописном тексте, который иллюстрирует, как встраивать then () в цикл, который находится внутри then ().

У меня есть следующие функции then (), которые отлично работают.

но мне нужно, чтобы функции 1–3 выполнялись n раз, основываясь на свойстве массива объекта процесса после того, как он был возвращен из _promptUploadDialog

    .then(process => this._promptUploadDialog(process))            
        .then(process => this._function1(process))
        .then(process => this._function2(process))
        .then(process => this._function3(process))

должно статьпримерно так:

 .then(process => this._promptUploadDialog(process)
     process.array1.forEach(function (value) {
        process.currentobject = value;
        this._function1(process))
            .then(process => this._function2(process))
            .then(process => this._function3(process))
     }); 
)            

Пробовал

return Promise.resolve<UploadDataProcess>({
            uploadResponse: undefined,           
            arrayProp: [1,2,3]
        })
            .then(process => this._promptUploadDialog(process))
            .then(process => 
                process.arrayProp.forEach((value) => {
                    this._function1(process)
                        .then(process => this._function2(process))
                        .then(process => this._function3(process));
                    })
            );

Но я получаю ошибку компиляции:

TS2322 Тип "Promise" не назначается типу«Обещание».

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Когда вы используете синтаксис { ... } для определения лямбда-функции, он не return последняя инструкция (в отличие от (arg) => statement, который возвращает значение statement).

Итак, вы видите, что у вас проблема с void, возвращаемым последним Promise вместо вашего типа данных UploadDataProcess. Это потому, что вам не хватает ключевого слова return. Просто добавьте его, и все будет хорошо:

return Promise.resolve<UploadDataProcess>({
        uploadResponse: undefined,           
        arrayProp: [1,2,3]
    })
        .then(process => this._promptUploadDialog(process))
        .then(process => 
            process.arrayProp.forEach((value) => {
                return /* <-- HERE */ this._function1(process)
                    .then(process => this._function2(process))
                    .then(process => { this._function3(process));
                                       return process; /* <-- and return process at the end if it's your object */ }
                })
        );
0 голосов

Что если вы сделаете что-то вроде:

.then(process => this._promptUploadDialog(process))
  .then(process => process.array1.forEach((value)=>
     {
       this._function1(process)
        .then(process => this._function2(process))
        .then(process => this._function3(process))
     });

ваши функции 1,2,3 будут в цикле, основанном на process.array1, что вы хотите, если я понимаю ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...