如果出错,如何控制Javascript的异步/等待行为?

时间:2017-08-15 15:34:36

标签: javascript node.js ecmascript-6 async-await es6-promise

我正在尝试ES6 Async / Await功能,使用async / await比使用Genrators和Promise更容易实现。

例如,当我们从getActiveSession函数调用promise函数(async中的catch时) - 如果Promise失败,它将被捕获到 async function createSession(context) { try { let activeSession = await getActiveSession(context); if (activeSession) { return activeSession; } else { let session = await createNewSession(context); return session; } } catch (createSessionException) { throw createSessionException; } } 块中并被处理。

newSession

如果我需要继续而不打破程序流程怎么办?如果getActiveSession失败,我需要创建一个getActiveSession

目前,如果No Session Found承诺被拒绝且错误为createSession,则同样的错误消息也会被投放到insert . . . select

2 个答案:

答案 0 :(得分:0)

  

如果我需要继续而不打破程序流程怎么办?即如果getActiveSession失败,我需要创建一个newSession。

如果getActiveSession失败(或返回null),则创建一个新会话:

async function createSession(context) {
  try {
    let activeSession = await getActiveSession(context);
    if (activeSession) {
      return activeSession;
    }
  } catch (ex) { }
  return await createNewSession(context);
}

答案 1 :(得分:-1)

catch块中添加所需的逻辑,而不是抛出错误。

您在catch块中重新抛出的错误实际上是您的async函数拒绝而不是解析的原因。

async function foo() {
    try {
        throw new Error("let's go to the catch block")
    } catch (e) {
        return safelyCreateSession()
    }
}

如果您仍想从函数中重新抛出,这意味着您需要在调用它的函数中处理它:

async function main() {
    let result;
    try {
        result = await aFunctionThatThrows()
    } catch (e) {
        result = aFunctionThatDoesNotThrow()
    }
    // use result
}