ES6:如何 return 从内部承诺然后阻塞

ES6: How to return promise from inside then block

我正在使用 returns 承诺的函数对密码进行哈希处理。我正在尝试将结果与 node-sqlite3 一起使用,它有一个接受 SQL 命令的 db.run() 方法、一个参数数组和一个可选的回调。我尝试了如下操作:

var maybeError = hashPassword("foo")
  .then(function(hashed) {
    return new Promise(function(resolve, reject) { 
      db.run(
        "insert into blah hashed value ?",
        [hashed], 
        function(err) {
          if(err) reject(err); else resolve();
        }
      );
    });
  })
  .catch(//something else);

这个想法在不包含在 hashPassword() 函数的 .then() 块中时有效。我想将 maybeError Promise 导出到一个单独的 server.js 文件,该文件将使用它来生成 HTTP 状态代码等

编辑:

评论正确地指出了原始 Plunk 中的一个错误,该错误是调整代码以突出我遇到的问题的产物。

更正了那个错误后,我认为仍然存在 updated Plunk 所示的错误。

// Simulate a database a la node-sqlite3
var fakeDb = function(sql, params, cb) {
  setTimeout(cb("Error"), 500);
};

// Test that the fakeDB() function works by itself
var noPromise = function(sql, params) {
  fakeDb(sql, params, function(e) {
    document.write(e);
  });
};

noPromise("foo", "bar");

// Wrap fakeDB() callback in single promise, that works
var singlePromise = function(sql, params) {
  return new Promise(function(resolve, reject) {
    fakeDb(sql, params, function(e) {
      if (e) {
        reject(e);
      } else {
        resolve();
      }
    });
  });
};

singlePromise("foo", "bar")
  .catch(function(e) {
    document.write(e);
  });


// Simulate a password hashing function that returns a promise
var hashPassword = function() {
  return new Promise(function(resolve, reject) {
    resolve();
  });
};

// Verify that the fake password hashing function works
hashPassword()
  .then(document.write("foo"));

/* Now attempt to return a promise from the fakeDB function,
 * but this time wrap that inside the then() block of hashPassword.
 * This doesn't work.
 */
var nestedPromise = hashPassword()
  .then(function(sql, params) {
    return new Promise(function(resolve, reject) {
      fakeDb(sql, params, function(e) {
        if (e) {
          reject(e);
        } else {
          resolve();
        }
      });
    });
  });

nestedPromise("foo", "bar") // <== This was the problem: should not have arguments.
  .catch(function(e) {
    document.write(e);
  })
  .then(function(x) {
    document.write(x);
  });

这会将 ErrorfooError 但不会 ErrorfooErrorError 写入文档。 nestedPromise() 函数中的 return 似乎不起作用。

谢谢!

Error is not appearing from the call to nestedPromise.

那是因为 nestedPromise 是一个 Promise(像 oldPromise),而不是函数(不像 noPromisesinglePromise ).你不能调用它。您甚至可以在控制台中看到:

Uncaught TypeError: nestedPromise is not a function

问题似乎是我在调用 nestedPromise 时带有参数。 @Bergi 编辑了我的 Plunk 以删除参数。因此,可以 return 以我尝试的方式进行承诺,只要您不像白痴一样搞砸函数调用。