javascript - 如何在 Node.js 中检测多个数组的多个异步调用何时完成

标签 javascript node.js promise sftp

我正在使用 [ssh2-sftp-client][1] 包递归读取给定远程路径内的所有目录。

这是代码。

const argv = require('yargs').argv;
const client = require('ssh-sftp-client');
const server = new Client();
const auth = {
    host: '192.168.1.11',
    username: argv.u,
    password: argv.p
};

const serverRoot = '/sites/';
const siteName = 'webmaster.com';

// list of directories on the server will be pushed to this array
const serverPaths = [];

server.connect(auth).then(() => {
    console.log(`connected to ${auth.host} as ${auth.username}`);
}).catch((err) => {
    if (err) throw err;
});

server.list('/sites/').then((dirs) => {
    redursiveDirectorySearch(dirs, `${serverRoot}${siteName}/`);
})
.catch((err) => {
    if (err) throw err;
});

function recursiveDirectorySearch(dirs, prevPath) {
    let paths = dirs.filter((dir) => {
    // returns directories only
        return dir.type === 'd';
    });

    if (paths.length > 0) {
        paths.forEach((path) => {
            server
                .list(`${prevPath}${path.name}`)
                .then((dirs) => {
                    console.log(`${prevPath}${path.name}`);
                    recursiveDirectorySearch(dirs, `${prevPath}${path.name}`);
                    serverPaths.push(`${prevPath}${path.name}`);
                })
        }
    }
}

首先,将与服务器建立连接,然后列出“/sites/”目录下的所有内容,然后将其传递给“recursiveDirectorySearch”函数。该函数将接收服务器上“/sites/”目录下找到的任何内容的数组作为第一个参数,该参数将被过滤掉,因此它只有目录。如果找到一个或多个目录,将为数组中的每个目录调用服务器,以便检索“/sites/”+“数组中的目录名称”下的所有内容。将使用调用服务器返回的任何内容再次调用相同的函数,直到找不到其他目录。

每当找到目录时,其字符串名称将被推送到“serverPaths”数组中。据我所知,此搜索正在运行并成功将所有目录名称推送到数组中。

但是,我想不出一种方法来检测对所有目录的递归搜索何时完成,以便我可以对“serverPaths”数组执行某些操作。

我尝试利用 Promise.all(),但在未知调用多少个函数时不知道如何使用它。

最佳答案

您只是缺少几个 return,添加一个 Promise.all 和一个 Array#map 就可以了完成

注意:不要在 serverPaths 上使用 Promise.all,而是使用在 .then 中返回 Promise 的事实将导致由 .then 返回的 Promise 接受返回的 Promise(嗯,这不是很好解释,是吗,但它确实是 Promises 101 的东西!

server.list('/sites/').then((dirs) => {
    // added a return here
    return recursiveDirectorySearch(dirs, `${serverRoot}${siteName}/`);
})
.then(() => {
    // everything is done at this point,
    // serverPaths should be complete
})
.catch((err) => {
    if (err) throw err;
});

function recursiveDirectorySearch(dirs, prevPath) {
    let paths = dirs.filter((dir) => {
    // returns directories only
        return dir.type === 'd';
    });
    // added a return, Promise.all and changed forEach to map
    return Promise.all(paths.map((path) => {
        //added a return here
        return server
            .list(`${prevPath}${path.name}`)
            .then((dirs) => {
                console.log(`${prevPath}${path.name}`);
                // swapped the next two lines
                serverPaths.push(`${prevPath}${path.name}`);
                // added a return here, push the path before
                return recursiveDirectorySearch(dirs, `${prevPath}${path.name}`);
            })
    }));
}

关于javascript - 如何在 Node.js 中检测多个数组的多个异步调用何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180932/

相关文章:

Javascript 代码修改...简单错误?

javascript - 如何启动模态表单 UL 项目

javascript - 将 python 回调函数转换为 javascript

node.js - 如何保持/*!与 UglifyJS2 的评论?

javascript - 为什么我的 do..while 循环没有正确执行异步等待代码中的 setTimeout?

arrays - 如何使用 Sequelize + PostgreSQL 将项目 append 到数组值

javascript - js 减少只有空值的数组

javascript - 跨域问题,不同端口的HTTP请求

node.js - NestJS 访问管道中的响应对象

javascript - 我可以在 javascript 中强制解决等待结果的 promise 吗?