【问题标题】:Javascript functions not called in correct order, need asyncJavascript 函数未按正确顺序调用,需要异步
【发布时间】:2020-05-03 11:43:53
【问题描述】:

下面的代码 sn-p 没有按正确的顺序运行...... for 循环在任何其他函数可以解析之前在每次迭代中调用 downloadFile 函数调用,这会影响返回到最终回调的链接数.

我需要的是一个循环迭代,只有在 appendLinksList 函数解析并返回一个链接后才能完成。我假设我需要异步来阻止这些功能?我将如何使用 async 来获得正确的流程,而不是在其他任何东西可以解析值之前调用 downloadFiles 函数?

注意,回调函数上面已经定义了这段代码sn-p

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

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    您可以将循环包装在立即调用的异步函数中。

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

    但是,您想要的结果(链接)将永远是一个承诺。 只能在异步函数中解决。或者,您可以使用 immediateInvokedAsyncFunction 内部的链接调用回调

    【讨论】:

    • 你如何在包装函数之外有一个等待?我认为 await 只能在异步函数中使用
    • 就是这样。为了按顺序进行异步操作。整个过程需要异步运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2021-11-14
    相关资源
    最近更新 更多