【问题标题】:using promises in node.js to create and compare two arrays在 node.js 中使用 Promise 创建和比较两个数组
【发布时间】:2017-06-28 20:28:18
【问题描述】:

我需要比较两个数组,第一个是数据库中的几个文件名,第二个是我已经下载到客户端的文件列表。想法是加载客户端上缺少的任何文件。 由于通过fs 的读取速度慢了两次,我尝试使用 Promises 等待一个函数在下一个函数开始之前完成。但不知怎的,我迷路了…… 到目前为止我的代码:

let filesIneed = [];
let filesIhave = [];
let filesToFetch = [];
getLocalFiles().then(getFilesIneed).then(getfilesToRetreive);

function getLocalFiles() {
    fs.readdir(localPath, (err, files) => {
        files.forEach(file => {
                filesIhave.push(file)
        });
    })
    return Promise.all(filesIhave);
}

function getFilesIneed () {
    for (let x of docs) {//this is my JSON
        filesIneed.push(y.NameOfFileIShouldHave);
        }
    }
    return Promise.all(filesIneed);
}

function getfilesToRetreive() {
    filesToFetch = _.difference(filesIneed, filesIhave);
    return Promise.all(filesToFetch);
}


console.log(filesToFetch);

我确实得到了第一个和第二个数组(“filesIneed”和“filesIhave”),但差异总是空的。所以也许我只是破坏了 Promise,因为这个概念对我来说是全新的,我知道我只理解了一半。

【问题讨论】:

    标签: node.js lodash es6-promise fs


    【解决方案1】:

    这是完全错误的。您不能在文件名数组上运行 Promise.all。你只能在一系列 Promise 上运行它。

    当您已经拥有该数组时,也无需一次将数组的每个元素推入一个空数组,以返回该数组。

    您不能使用 Promise 来比较两个数组。您可以使用 lodash 比较 Promise 的 then 处理程序中的两个数组,该处理程序解析为一个数组。

    如果您想从 fs.readdir 获得文件名的承诺,请使用以下模块之一:

    也不要对所有东西都使用全局变量,因为你会遇到任何并发问题。

    另外,阅读承诺。如果不了解 Promise 的工作原理,您将无法猜出正确的使用方式。即使查看一些工作代码示例也会有很大帮助,并且在堆栈溢出中有很多关于 Promise 的问题和答案:

    【讨论】:

    • 哇——这太可怕了——我会全部看完的。谢谢。我知道代码中有一些与承诺无关的缺陷,但这主要是为了指出我正在尝试的内容。原来的一段代码更好一些,而且完全不同(这只是一个例子)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2013-09-15
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多