如何解决用Promise解决异步函数,但返回未定义
我正在使用await从db读取数据,所以我使用了Promise,但是该函数似乎什么也没返回
async function read() {
return new Promise((resolve,reject) => {
const db = new DB();
db
.read()
.then(result => {
resolve(result);
}).catch(() => {
reject('db-error');
});
});
}
(async () => {
const data = await read();
console.log(data); // undefined
})();
如何使read()返回结果?
解决方法
您使它变得比必需的更加复杂。如果您已经在使用返回诺言的API,则无需自己使用诺言构造函数。
仅当您在其中使用async
来处理承诺时,才需要将函数声明为await
。
所以做:
function read() {
const db = new DB();
return db
.read()
.catch(() => {
return 'db-error';
});
}
或
async function read() {
const db = new DB();
try {
return await db.read();
} catch(error) {
return 'db-error';
}
}
如果仍然没有获得所需的值,则说明您没有正确使用数据库API,因此必须阅读其文档以弄清楚如何取回正确的数据。
,编写 MDN Web Docs 的那些很棒的家伙说,如果正在等待的承诺被拒绝,await
的结果将是 undefined
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#handling_rejected_promises
看看下面的场景。
这是一个返回 Promise 的简单函数:
function asyncFunc(waitTime) {
return new Promise((resolve,reject) => {
setTimeout(() => {
// say we prefer people who do things in 3 seconds or less
if (waitTime <= 3000) {
resolve('Promise resolved! You\'re fast! :)');
} else {
reject('Promise rejected! You\'re slow! :(');
}
},waitTime);
});
}
让我们使用与您类似的方法测试该函数:
async function testAsyncFunc(waitTime) {
try {
const result = await asyncFunc(waitTime);
console.log(result);
} catch(error) {
console.error(error.message);
}
}
testAsyncFunc(3000); // Returns `Promise resolved! You're fast! :)`,as expected
testAsyncFunc(3001); // Returns `undefined` instead of `Promise rejected! You're slow! :(`
但是由于我们想要异步操作的实际拒绝错误而不是 undefined
,因此解决方案是将 catch
链接到 await 语句以在您调用异步函数时立即捕获任何拒绝错误,然后抛出错误以便它可以被您可能想要使用的任何 catch
错误处理程序捕获,如下所示:
async function testAsyncFunc(waitTime) {
try {
const result = await asyncFunc(waitTime)
.catch(error => {
// throw the rejection error so it can be handled by the catch block below
throw new Error(error);
});
// if no errors
console.log(result);
} catch(error) {
console.error(error.message);
}
}
testAsyncFunc(3001); // Returns the expected result: `Promise rejected! You're slow! :(`
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。