我喜欢Async/Await在Typescript等中提供的新功能的平坦性.但是,我不确定我喜欢这样一个事实,即我必须await在try...catch块的外部声明变量才能在以后使用它.像这样:
let createdUser
try {
createdUser = await this.User.create(userInfo)
} catch (error) {
console.error(error)
}
console.log(createdUser)
// business
// logic
// goes
// here
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但似乎最好不要在机构中放置多行业务逻辑try,所以我只留下createdUser在块外声明,在块中分配它的替代方案,以及然后用它.
在这种情况下,最佳做法是什么?
使用异步 javascript 时,每秒函数如下所示:
function_name()
{
return new Promise((resolve,reject) => {
// do some async task
resolve();
});
}
Run Code Online (Sandbox Code Playgroud)
即使使用 es6 async/await,我也无法避免“return new Promise((resolve,reject) => { ...”这一部分。
有没有另一种方法可以在没有所有这些重复行的情况下编写这样的代码?
谢谢。
我使用async/await ecma6标准,没有任何自定义库.
我现在不知道如何正确捕获并抛出错误.我有多个异步/等待函数,如果在某个地方发生严重错误,我想把错误抛到顶部和所有异步函数并停止执行该函数.
我试图从异步/ 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);
}
Run Code Online (Sandbox Code Playgroud)
(node:13964)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):错误:未定义getSessionID响应(节点:13964)[DEP0018]弃用警告:不推荐使用未处理的承诺拒绝.将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程.附加调试器.
所以我似乎不允许从异步函数中抛出异常,甚至在node.js中的promise的catch块中重新抛出异常?
那么我该如何使用呢?我是否应该在异步函数中捕获错误并在promise中返回错误并重新抛出异步函数?
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;}
}
Run Code Online (Sandbox Code Playgroud)
但这意味着在我的第一个异步函数的调用堆栈中,每个函数都需要异步,我必须等待承诺,即使我真的不需要它.
我希望有人能开导我.
关心Ruvi
编辑基本调用堆栈伪代码:
async startTest[arr]{
for (var i = 0; i < arr.length; i++)
{
try {
await runStep(arr[i];
} catch(err) {
console.log(err); …Run Code Online (Sandbox Code Playgroud)