Вложенные обещания с циклом for не работают - PullRequest
0 голосов
/ 03 июня 2019

У меня есть этот вложенный цикл обещаний, и в конце он завершает цикл for, который помещает элементы в массив файлов.

public async content() {
        let files = [];
        return new Promise(async (resolve, reject) => {
             await this.axios.get(this.currentRequest).then(async biosample => {
                 await this.axios.get(this.currentRequest + biosample.data.item).then(async datasets => {
                     for (let i = 0; i < datasets.data.Items.length; i++) {
                        await this.axios.get(this.currentRequest + datasets.data.Items[i].Id).then(response => {
                            files.push(response.data.Item);
                        }).catch(reason => {
                            reject(reason)
                        });
                    }
                })

            }).catch(function (error) {
                reject(new Error(error.response))
            });
            resolve(files)
        })
    }

Звонки сделаны правильно, потому что если я использую Promise.all([promises here]), то это работает.Но я пытаюсь научиться правильно связывать обещания.

Когда я отлаживаю с помощью наборов данных веб-шторма, кажется, они определены и обладают необходимыми свойствами.

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

Схематически ваш код должен нравиться

content() {
    return Promise.resolve()
        .then(_ => this.axios.get(this.currentRequest)
        .then(biosample => this.axios.get(this.currentRequest + biosample.data.item))
        .then(datasets => Promise.all(datasets.data.Items.map(item => this.axios.get(this.currentRequest + item.Id))))
}
2 голосов
/ 03 июня 2019

Вы не используете потенциал ожидания. Ваш код может быть таким простым:

public async content() {
    let files = [];
    return new Promise(async (resolve, reject) => {
        try {
            let biosample = await this.axios.get(this.currentRequest)
            let datasets = await this.axios.get(this.currentRequest + biosample.data.item)
            for (let i = 0; i < datasets.data.Items.length; i++) {
                let response = await this.axios.get(this.currentRequest + datasets.data.Items[i].Id)
                files.push(response.data.Item);                 
            }               
            resolve(files)
        } catch(error) {
            reject(new Error(error.response || error))
        };          
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...