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
),而不是函数(不像 noPromise
或 singlePromise
).你不能调用它。您甚至可以在控制台中看到:
Uncaught TypeError: nestedPromise is not a function
问题似乎是我在调用 nestedPromise
时带有参数。 @Bergi 编辑了我的 Plunk 以删除参数。因此,可以 return 以我尝试的方式进行承诺,只要您不像白痴一样搞砸函数调用。
我正在使用 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
),而不是函数(不像 noPromise
或 singlePromise
).你不能调用它。您甚至可以在控制台中看到:
Uncaught TypeError: nestedPromise is not a function
问题似乎是我在调用 nestedPromise
时带有参数。 @Bergi 编辑了我的 Plunk 以删除参数。因此,可以 return 以我尝试的方式进行承诺,只要您不像白痴一样搞砸函数调用。