Javascript функции не вызываются в правильном порядке, требуется асинхронность - PullRequest
0 голосов
/ 03 мая 2020

Приведенный ниже фрагмент кода работает не в правильном порядке ... for l oop вызывает вызов функции downloadFile на каждой итерации, прежде чем разрешатся какие-либо другие функции, что влияет на количество ссылок, возвращаемых в финал. callback.

Что мне нужно, так это итерация l oop до fini sh только после того, как функция appendLinksList разрешит и вернет ссылку. Я предполагаю, что мне нужен asyn c, чтобы заблокировать функции? Как бы я использовал asyn c, чтобы получить правильный поток вместо вызова функции downloadFiles, прежде чем что-либо еще сможет разрешить значение?

Обратите внимание, что функции обратного вызова были определены над этим фрагментом кода

const entries [ /* Array of objects containing a path_display property */];

let links = [];

for(let i = 0; i < entries.length; i++) {

            const appendLinksList = link => {
                if(i !== entries.length - 1) return links = [...links, link];

                return callback(null, links);
            };

            const downloadFile = path => {
                Dropbox.filesGetTemporaryLink({ path })
                .then(file => {
                    return appendLinksList(file.link);
                })
                .catch(err => {
                    return res.status(500).json(err.message);
                });
            };

            downloadFile(entries[i].path_display);
        };

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете обернуть свой l oop в немедленно вызванную asyn c функцию.

const linksResolved = await (async() => {
    let links = [];
    for(let i = 0; i < entries.length; i++) {

            const appendLinksList = link => {
                if(i !== entries.length - 1) return links = [...links, link];

                return callback(null, links);
            };

            const path = entries[i].path_display;
            await Dropbox.filesGetTemporaryLink({ path })
                .then(file => {
                    return appendLinksList(file.link);
                })
                .catch(err => {
                    return res.status(500).json(err.message);
                });
            };
        };
    return links;
})()

Однако желаемый результат (ссылки) всегда будет обещанием. Может быть разрешено только в функции asyn c. Или вы можете вызвать обратный вызов со ссылками внутри функции сразу же после вызова InVokedAsync

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