Проблема с использованием обещания и ожидания метода Vue - PullRequest
0 голосов
/ 07 февраля 2019

Я запускаю функцию в mount (), чтобы получить файлы из моей учетной записи Dropbox, используя обещание.После успешного выполнения этого обещания я зацикливаю все файлы и запускаю другую функцию обещания, чтобы получить дополнительную информацию о каждом файле и добавить ее к объекту.

data () {
    return {
        results: [],
        dropbox: [],
    }
},
mounted() {
    dropbox.filesListFolder({path: '/wallpapers'}).then(this.successHandler)
    this.dropbox = dropbox
},
methods: {
    successHandler (response) {
        const files = response.entries;
        async function processArray(files) {
            for (const item of files) {
                item['meta'] = await this.getFileInfo(item.id);
            }
        }
        processArray(files);
        this.results = files;
    }
    getFileInfo (id) {
        this.dropbox.filesGetMetadata({
            path: id,
        })
        .then(this.successFileInfo)
    },
    successFileInfo (response) {
        return response; 
    }
}

Но это возвращает ошибку:

Невозможно прочитать свойство 'getFileInfo' из неопределенного

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Когда вы вызываете item['meta'] = await this.getFileInfo(item.id);, this относится к области действия функции processArray, а не к компоненту vue.

Если я не ошибаюсь, вы должны просто сделать:

async successHandler (response) {
    const files = response.entries;
    for (const item of files) {
        item['meta'] = await this.getFileInfo(item.id);
    }
    processArray(files);
    this.results = files;
}
0 голосов
/ 07 февраля 2019

У вас проблема с областью действия - неправильно this:

    let vm = this;
    async function processArray(files) {
        for (const item of files) {
            item['meta'] = await vm.getFileInfo(item.id);
        }
    }

Или вы можете сделать:

processArray.bind(this)(files);

UPD (из комментариев):

Вы забыли вернуться в getFileInfo -метод

getFileInfo (id) {
    return this.dropbox.filesGetMetadata({
        path: id,
    })
    .then(this.successFileInfo)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...