函数promise.all.then undefined的返回值

时间:2018-01-24 19:10:57

标签: javascript promise async-await

我开始使用Node.js中的raw promises和async / await。

我想要并行运行2个“promis-ified”函数,then()对结果执行一些操作并返回新数据。返回值始终为undefined,但在.then()内,该值是我所期望的。

这是我的功能:

const fs = require('fs-promise-util').default;
/**
 * compares 2 directories to find hooks of the same name
 *
 * @return {Array} hooks that exist in remote and local directories
 */
function remoteVSlocal () {
    try {
        Promise.all([
                fs.readdir(REMOTE_HOOKS_PATH),
                fs.readdir(LOCAL_HOOKS_PATH)
        ]).then(function ([REMOTE_HOOKS, LOCAL_HOOKS]) {

            //filter out values that exist in both arrays
            //this returns a new array with the values I expect
            return LOCAL_HOOKS.filter(function (name) {
                return REMOTE_HOOKS.includes(name);
            });
        });
    } catch (err) {
        return err;
    }
}

当我调用该函数时,它返回undefined

console.log(remoteVSlocal());

我希望调用remoteVSlocal()来返回由Array.filter()创建的新数组。

1 个答案:

答案 0 :(得分:2)

您的函数remoteVSlocal()实际上并未返回任何返回值为undefined的原因。您需要在调用函数时返回promise并使用返回的promise。从嵌入式.then()处理程序返回值不会从函数本身返回。

这是代码的工作版本,假设fs.readdir()实际上确实返回了一个承诺(btw是采用现有标准API并改变其功能的可怕做法 - 有更好的方法来宣传整个库)

无论如何,这里的代码对你有用:

function remoteVSlocal () {
    return Promise.all([
            fs.readdir(REMOTE_HOOKS_PATH),
            fs.readdir(LOCAL_HOOKS_PATH)
    ]).then(function ([REMOTE_HOOKS, LOCAL_HOOKS]) {

        //filter out values that exist in both arrays
        //this returns a new array with the values I expect
        return LOCAL_HOOKS.filter(function (name) {
            return REMOTE_HOOKS.includes(name);
        });
    });
}

此外,您需要从remoteVSlocal()返回承诺,然后使用返回的承诺:

remoteVSLocal().then(result => {
   // use result here
}).catch(err => {
   // process error here
});

更改摘要:

  1. remoteVSlocal()
  2. 返回承诺
  3. 致电remoteVSlocal()时,请使用.then().catch()返回的承诺。
  4. 删除try/catch,因为此处没有同步例外。承诺将通过被拒绝的承诺传播错误。