【发布时间】:2018-07-19 01:05:55
【问题描述】:
我使用 async/await ecma6 标准,没有任何自定义库。
我目前不知道如何正确捕获和抛出错误。 我有多个 async/await 函数,如果发生严重错误以下的某个地方,我想将错误抛出到所有异步函数的顶部并停止执行该函数。
我试图从 async/await 函数中抛出异常并在目标函数中捕获它,但在 node.js 中出现错误:
this.basicAuthLogin= async function(user)
{
"use strict";
const login = new Login(this.host, this.url, user, user.pw);
//getSessionID throws error
this.sessionID = getSessionID(result.request.response);
}
(node:13964) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝(拒绝 id:1):错误:getSessionID 响应未定义 (节点:13964)[DEP0018] 弃用警告:未处理的承诺 拒绝被弃用。在未来,承诺拒绝是 未处理将以非零退出终止 Node.js 进程 代码。已附加调试器。
所以看来我不允许从异步函数中抛出异常,甚至在 node.js 中的 promise 的 catch 块中重新抛出异常?
那么我该如何让它工作呢? 我是否应该在异步函数中捕获错误并在承诺中返回错误并重新抛出异步函数?
this.basicAuthLogin= async function(user)
{
"use strict";
const login = new Login(this.host, this.url, user, user.pw);
try{
//getSessionID throws error
this.sessionID = getSessionID(result.request.response);
} catch(err) { return err;}
}
但这意味着在我的第一个异步函数的调用堆栈中,每个函数都需要异步,即使我并不真正需要它,我也必须等待它。
希望有人能赐教。
问候 鲁维
编辑基本调用堆栈伪代码:
async startTest[arr]{
for (var i = 0; i < arr.length; i++)
{
try {
await runStep(arr[i];
} catch(err) {
console.log(err);
break;
}
}
}
async runStep(step)
{
try {
var userIsValid = await validateUser(step.user);
var req = buildRequest(step.request);
var result = await sendRequest(req);
var verify = verifyResult();
} catch(err){ throw err;}
}
async validateUser(user)
{
//make checks
//
var result = await this.authenticate(parameter).catch(err => {throw err});
userFound = true;
}
function authenticate(parameter) {
//can throw async function
basicAuthLogin(parameter).catch(err => {throw err};
}
function async basicAuthLogin(parameter()
{
try {
//can throw async function
var result = await request(parameter);
//can throw sync function
this.sessionID = getSessionID(response);
//can throw sync function
} catch(err) { throw err; }
}
【问题讨论】:
-
getSessionID是异步的吗?是因为它是async还是因为它返回了一个承诺? -
不,它不是异步的,它是一个简单的函数,它抛出一个异常,我想在调用堆栈上捕获 5 或 6 层,但似乎我不允许这样做。
-
getSessionID response is undefined我认为您应该确保响应已定义 -
@Ruvi:谢谢。既然
basicAuthLogin中没有任何东西是异步的,那为什么它是async函数呢? -
请修正缩进以使示例更易于阅读,暂时投反对票。
标签: javascript node.js promise async-await