使用Promise在Bluebird的另一个函数内调用函数promise库
我有3个Node Js
function。 我在这里想要做的是,我想调用normalizeFilePath
并获得规范化的path,之后,检查文件是否存在或与normalizedFilePath
和所有这些之后,创build一个文件,如果该文件尚不存在。 这是使用promise(Bluebird)的第一天,我是Node JS
和Java Script
新手。 下面的代码结构越来越复杂。 当然这根本不是一个好主意。
var createProjectFolder = function (projectName) { }; var checkFileExistance = function (filePath) { return new promise(function (resolve, reject) { normalizeFilePath(filePath).then(function (normalizedFilePath) { return fs.existSync(normalizedFilePath); }); }) }; var normalizeFilePath = function (filePath) { return new promise(function (resolve, reject) { resolve(path.normalize(filePath)); }); };
我如何pipe理承诺来实现这个概念?
让我们通过两个简单的步骤改善您的代码。
承诺是为了asynchronousfunction
只要path.normalize
是同步的,它不应该被包装在promise中。
所以可以这么简单。
var normalizeFilePath = function (filePath) { return path.normalize(filePath); };
但现在让我们假装 path.normalize
是asynchronous的,所以我们可以使用你的版本。
var normalizeFilePath = function (filePath) { return new Promise(function (resolve, reject) { resolve( path.normalize(filePath) ); }); };
Promise所有的东西
同步是不好的。 同步块事件循环。 所以,而不是fs.existsSync
我们将使用fs.exists
。
var checkFileExistance = function (filePath) { return new Promise(function (resolve, reject) { fs.exists(filePath, function (exists) { resolve(exists); }); }); };
正如你所看到的,我们正在封装asynchronous函数,接受一个承诺的callback。 “promisify”一个函数是一个相当普遍的概念,所以我们可以为此使用一个库 。 甚至用fs-promise ,也就是 – 你猜 – fs
有承诺。
链接承诺
现在我们要做的是三个接一个的行动:
- 规范化文件path
- 检查文件是否已经存在
- 如果没有,创build一个目录
牢记这一点,我们的主要function可以看起来像这样。
var createProjectFolder = function (projectName) { normalizeFilePath(projectName) .then(checkFileExistance) .then(function (exists) { if (!exists) { // create folder } }) .catch(function (error) { // if there are any errors in promise chain // we can catch them in one place, yay! }); };
不要忘记添加catch
电话,以免错过任何错误。