使用Promises在Bluebird承诺库的另一个函数内调用函数

时间:2016-04-22 19:16:06

标签: javascript node.js

我有3个/etc/nginx/nginx.conf个功能。我在这里尝试做的是,我想调用Node Js并获取规范化路径,然后检查文件是否存在与normalizeFilePath一起存在,并且在所有这些之后,创建一个文件,如果该文件尚不存在。这是使用promises的第一天(Bluebird),我是normalizedFilePathNode JS的新手。下面的代码结构越来越复杂。当然,这根本不是一个好主意。

Java Script

我如何管理实施该概念的承诺?

1 个答案:

答案 0 :(得分:7)

让我们通过两个简单的步骤改进您的代码。

Promise用于异步函数

只要path.normalize是同步的,它就不应该包含在promise中。

所以它可以那么简单。

var normalizeFilePath = function (filePath) {
  return path.normalize(filePath);
};

但是现在让假装 path.normalize是异步的,所以我们可以使用你的版本。

var normalizeFilePath = function (filePath) {
  return new Promise(function (resolve, reject) {
    resolve( path.normalize(filePath) );
  });
};

宣传所有的事情

同步很糟糕。同步块事件循环。因此,我们将使用fs.existsSync而不是fs.exists

var checkFileExistance = function (filePath) {
  return new Promise(function (resolve, reject) {
    fs.exists(filePath, function (exists) {
      resolve(exists);
    });
  });
};

正如您所看到的,我们正在包装异步函数,该函数接受带有promise的回调。对于" promisify"这是一个非常普遍的概念。一个函数,所以我们可以使用library。甚至可以使用fs-promise,也就是说 - 你猜它 - fs有承诺。

链接承诺

现在,我们想要的是一个接一个地做三个动作:

  1. 规范化文件路径
  2. 检查文件是否已存在
  3. 如果没有,请创建目录
  4. 记住这一点,我们的主要功能可能如下所示。

    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来电,这样您就不会错过任何错误。