Javascript函数调用顺序不正确,需要异步调用。

下面的代码片断没有按照正确的顺序运行……在其他函数解析之前,for循环每次迭代都会调用downloadFile函数,这影响了返回到最终回调的链接数量。

我需要的是只有在appendLinksList函数解析并返回一个链接后才完成循环迭代。我想我需要用async来屏蔽这些函数吧?我如何使用async来获得适当的流程,而不是在其他任何东西解析一个值之前就调用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);
        };

解决方案:

你可以将你的循环包裹在一个立即调用的异步函数中。

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;
})()

但是,你想要的结果(链接)将永远是一个承诺.只能在一个异步函数中解析。或者你可以在立即调用的asyncFunction里面调用一个带链接的回调。

给TA打赏
共{{data.count}}人
人已打赏
未分类

用Typescript从动态字符串数组中获取值

2022-9-23 11:12:09

未分类

我应该让我的REST API成为文件上传的PUT或POST?

2022-9-23 11:12:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索