使用Promise在Bluebird的另一个函数内调用函数promise库

我有3个Node Jsfunction。 我在这里想要做的是,我想调用normalizeFilePath并获得规范化的path,之后,检查文件是否存在或与normalizedFilePath和所有这些之后,创build一个文件,如果该文件尚不存在。 这是使用promise(Bluebird)的第一天,我是Node JSJava 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有承诺。

链接承诺

现在我们要做的是三个接一个的行动:

  1. 规范化文件path
  2. 检查文件是否已经存在
  3. 如果没有,创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电话,以免错过任何错误。