我使用返回promise的函数哈希密码。我试图将结果与node-sqlite3
一起使用,db.run()
具有接受SQL命令,参数数组和可选回调的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
Promise导出到单独的// 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);
});
文件,该文件将使用它来生成HTTP状态代码等。
评论正确地标识了orignal Plunk中的错误,该错误是调整代码以突出我遇到的问题的工件。
更正了该错误后,我认为仍然存在错误,如updated Plunk所示。
ErrorfooError
这会将ErrorfooErrorError
而不是return
写入文档。 <{1}}函数中的nestedPromise()
似乎无效。
谢谢!
答案 0 :(得分:1)
调用
nestedPromise
时未显示错误。
这是因为nestedPromise
是承诺(如oldPromise
),而非功能(与noPromise
或singlePromise
不同) 。你不能称之为。你甚至可以在控制台中看到它:
Uncaught TypeError: nestedPromise is not a function
答案 1 :(得分:0)
问题似乎是我用参数调用nestedPromise
。 @Bergi编辑了我的Plunk以删除参数。因此,只要你不像白痴一样搞砸函数调用,就可以按照我尝试的方式返回一个承诺。