我正在使用返回承诺的函数对密码进行散列。我试图在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);当不包装在.then()函数的hashPassword()块中时,这个想法就会奏效。我希望将maybeError承诺导出到一个单独的server.js文件,该文件将使用它生成HTTP代码,等等。
编辑:
这些注释正确地识别了原始扑通中的一个错误,这是调整代码以突出我遇到的问题的一个工件。
在纠正了该错误之后,我认为仍然存在一个错误,如这个更新普伦克所示。
// 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写入文档。return在nestedPromise()函数中似乎不起作用。
谢谢!
发布于 2016-03-09 20:56:46
在对
nestedPromise的调用中没有出现错误。
这是因为nestedPromise是一个允诺(如oldPromise),而不是一个函数(与noPromise或singlePromise不同)。你不能这么说。您甚至可以在控制台中看到这一点:
Uncaught TypeError: nestedPromise is not a function发布于 2016-03-10 16:35:28
问题似乎是我用参数调用nestedPromise。@Bergi编辑了“我的普伦克”来删除这些论点。所以有可能以我尝试的方式返回一个承诺,只要你不像白痴一样把函数调用搞砸。
https://stackoverflow.com/questions/35901500
复制相似问题