我正在构建自己的borwserside javascript sdk,使用的是webpack和node。
我在sdk中创建了一个简单的身份验证函数。这是一个简单的回调函数,用于查询api并以回调的形式返回结果是否成功。
sdk.js
async authenticate(callback) {
try {
this.account = await this.repo.authenticate(this.product, this.origin);
if (this.account.success === false) {
return callback({
"success": false,
"response": "Failed To Authenticate"
});
}
return callback({
"success": true,
"response": this.account
});
} catch (e) {
return callback({
"success": false,
"response": e
});
}
}
现在在我的浏览器中,我有一个索引文件。它将实例化对象并调用此函数。
index.html
<script>
hsp = new HSP();
// function called on button click
async function done() {
// Works
hsp.authenticate((res) => {
console.log(res);
});
// DOES NOT WORK
try {
const auth = await hsp.authenticate();
console.log(auth);
} catch (er) {
console.log(er);
}
}
</script>
在上面的index.html示例中,身份验证的回调版本可以工作,但try catch块中的await/async版本的身份验证不能工作。为什么以及如何让它工作。
我希望这两个选项都能起作用。
我得到以下错误。它引用catch块和console.log(er)。
TypeError: t不是t.value (index.js:41)
的函数
发布于 2018-07-07 07:07:01
您混合了两种方法:callbacks
和promises
。使用promises
更强大,而且异步函数利用promise,它们允许您编写基于promise的代码,就像它是同步的一样,但不会阻塞主线程。
异步函数总是返回一个promise,无论您是否使用await。这个承诺解决了异步函数返回的任何问题,或者拒绝了异步函数抛出的任何问题。
在then或catch中的异步函数外部使用回调。
sdk.js
async authenticate() {
try {
this.account = await this.repo.authenticate(this.product, this.origin);
if (this.account.success === false) {
return {
"success": false,
"response": "Failed To Authenticate"
};
}
return {
"success": true,
"response": this.account
};
} catch (e) {
return {
"success": false,
"response": e
};
}
}
index.html
<script>
hsp = new HSP();
// function called on button click
async function done() {
// Works (Your callback here in then method)
hsp.authenticate().then((res) => {
console.log(res);
}).cath( err => console.log(er));
// It Will WORK (Make use of your callback outside of the async function)
try {
const auth = await hsp.authenticate();
console.log(auth);
} catch (er) {
console.log(er);
}
}
</script>
我希望这能有所帮助。
https://stackoverflow.com/questions/51207175
复制相似问题