NodeJs:承诺总是 returns 未定义
NodeJs: Promise always returns undefined
所以我有以下承诺,应该进入我的 sqlite 数据库并告诉我是否有匹配项。即使变量是正确的,它总是 returns 未定义。
var checkLoanable = function(bookID){
return new Promise((resolve, reject)=>{
db.run('SELECT * FROM book WHERE id=?',[bookID],(err,row)=>{
if (err) {
console.log("error")
reject();
}
if(row){
if(row.loanable==0){
console.log("not loanable")
reject();
}
console.log("success")
resolve(row);
}else{
console.log("undefined")
reject();
}
console.log("End of promise")
});
})
}
这是函数的调用
await checkLoanable(bookID)
.then(()=>{console.log("success")})
.catch(()=>{
res.status(422)
.setHeader('content-type', 'application/json')
.send({ message: "Failed to add loan: book is not loanable!"});
});
console.log("after promise");
await 在一个异步函数中,在我测试之后它确实等待 promise 结束然后继续代码。我不明白为什么它总是未定义。
预先感谢您的帮助。
不要混用 async/await
和 Promise
链使用其中之一。
使用 try...catch 或 Promise..then..catch
try {
const book = await checkLoanable(bookID);
res.json(book);
}catch ({message}) {
res.status(422).send(message);
}
// or
checkLoanable(bookID)
.then((book) => {res.json(book);})
.catch(({message}) => {
res.status(422).json({
message: "Failed to add loan: book is not loanable!"
});
});
举个例子,如果你使用这样的东西
const myPromise = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Success!');
}, 1000);
});
(async () => {
const result = await myPromise().then(data => {
console.log({data});
});
console.log({result});
})();
结果会是
{data: 'Success!'}
{result: undefined}
不能同时获取值。
run()
用于插入和更新行。
要获得单行,请使用 db.get()
。
db.get('SELECT * FROM book WHERE id=?', [bookID] , (err,row) => { });
至少如果您使用 npm/sqlite 包。
所以我有以下承诺,应该进入我的 sqlite 数据库并告诉我是否有匹配项。即使变量是正确的,它总是 returns 未定义。
var checkLoanable = function(bookID){
return new Promise((resolve, reject)=>{
db.run('SELECT * FROM book WHERE id=?',[bookID],(err,row)=>{
if (err) {
console.log("error")
reject();
}
if(row){
if(row.loanable==0){
console.log("not loanable")
reject();
}
console.log("success")
resolve(row);
}else{
console.log("undefined")
reject();
}
console.log("End of promise")
});
})
}
这是函数的调用
await checkLoanable(bookID)
.then(()=>{console.log("success")})
.catch(()=>{
res.status(422)
.setHeader('content-type', 'application/json')
.send({ message: "Failed to add loan: book is not loanable!"});
});
console.log("after promise");
await 在一个异步函数中,在我测试之后它确实等待 promise 结束然后继续代码。我不明白为什么它总是未定义。 预先感谢您的帮助。
不要混用 async/await
和 Promise
链使用其中之一。
使用 try...catch 或 Promise..then..catch
try {
const book = await checkLoanable(bookID);
res.json(book);
}catch ({message}) {
res.status(422).send(message);
}
// or
checkLoanable(bookID)
.then((book) => {res.json(book);})
.catch(({message}) => {
res.status(422).json({
message: "Failed to add loan: book is not loanable!"
});
});
举个例子,如果你使用这样的东西
const myPromise = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Success!');
}, 1000);
});
(async () => {
const result = await myPromise().then(data => {
console.log({data});
});
console.log({result});
})();
结果会是
{data: 'Success!'}
{result: undefined}
不能同时获取值。
run()
用于插入和更新行。
要获得单行,请使用 db.get()
。
db.get('SELECT * FROM book WHERE id=?', [bookID] , (err,row) => { });
至少如果您使用 npm/sqlite 包。