我开始使用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()
创建的新数组。
答案 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
});
更改摘要:
remoteVSlocal()
remoteVSlocal()
时,请使用.then()
和.catch()
返回的承诺。try/catch
,因为此处没有同步例外。承诺将通过被拒绝的承诺传播错误。