首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6:如何从内部返回承诺然后阻止

ES6:如何从内部返回承诺然后阻止
EN

Stack Overflow用户
提问于 2016-03-09 20:03:06
回答 2查看 828关注 0票数 0

我正在使用返回承诺的函数对密码进行散列。我试图在node-sqlite3中使用结果,它有一个接受SQL命令的db.run()方法、一个参数数组和一个可选的回调。我尝试了以下几种方法:

代码语言:javascript
复制
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);

当不包装在.then()函数的hashPassword()块中时,这个想法就会奏效。我希望将maybeError承诺导出到一个单独的server.js文件,该文件将使用它生成HTTP代码,等等。

编辑:

这些注释正确地识别了原始扑通中的一个错误,这是调整代码以突出我遇到的问题的一个工件。

在纠正了该错误之后,我认为仍然存在一个错误,如这个更新普伦克所示。

代码语言:javascript
复制
// 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写入文档。returnnestedPromise()函数中似乎不起作用。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-09 20:56:46

在对nestedPromise的调用中没有出现错误。

这是因为nestedPromise是一个允诺(如oldPromise),而不是一个函数(与noPromisesinglePromise不同)。你不能这么说。您甚至可以在控制台中看到这一点:

代码语言:javascript
复制
Uncaught TypeError: nestedPromise is not a function
票数 1
EN

Stack Overflow用户

发布于 2016-03-10 16:35:28

问题似乎是我用参数调用nestedPromise。@Bergi编辑了“我的普伦克”来删除这些论点。所以有可能以我尝试的方式返回一个承诺,只要你不像白痴一样把函数调用搞砸。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35901500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档