【问题标题】:React Native / Javascript async awaitReact Native / Javascript 异步等待
【发布时间】:2021-06-17 21:34:24
【问题描述】:

我想知道为什么代码是这样工作的:

async function Signin({ email, pass, confirmpass }) {
  const body = {
    'email': email,
    'pass': pass,
    'confirmpass': confirmpass,
  };
  const params = {
    endpoint: 'register_user',
    method: 'post',
    headers: null,
    body: body
  }
  const result = await api.connect(params);
  console.log(result);
}

但它不是这样工作的:

async function Signin({ email, pass, confirmpass }) {
  let result = await registerUser({ email, pass, confirmpass, });
  console.log(result);

  // TODO: api call 2
  // TODO: api call 3
  
}

async function registerUser({ email, pass, confirmpass }) {
  const body = {
    'email': email,
    'pass': pass,
    'confirmpass': confirmpass,
  };
  const params = {
    endpoint: 'register_user',
    method: 'post',
    headers: null,
    body: body
  }
  return api.connect(params);
}

它记录以下错误:Possible Unhandled Promise Rejection

我必须对 api 进行三个调用,因此为了使其更具可读性和更易于维护,我想在不同的函数中进行 api 调用。

我对 JS Async/Await 没有太多经验,我刚开始使用它是因为我需要在 React Native 中做一些事情,我之前是 PHP 的。

更新:我确实喜欢@safder 说 onj 评论并使用了 try catch 但现在它不等待结果

async function Signin({ email, pass, confirmpass }) {
  try {
    let result = await registerUser({ email, pass, confirmpass, });
    console.log(result);
  } catch {

  }

  // TODO: api call 2
  // TODO: api call 3

}

async function registerUser({ email, pass, confirmpass }) {
  let result = null;
  const body = {
    'email': email,
    'pass': pass,
    'confirmpass': confirmpass,
  };
  const params = {
    endpoint: 'register_user',
    method: 'post',
    headers: null,
    body: body
  }
  try {
   result = api.connect(params);
  } catch {

  }
  return result;
}

【问题讨论】:

  • 你遇到了什么错误?
  • @Safder 可能的未处理承诺拒绝
  • 您需要将其包装在 try/catch 块中以进行异步/等待
  • 未处理的 Promise 拒绝意味着您在调用异步函数时没有将其包装在 try ... catch 块中或使用 .catch() 来捕获任何潜在错误。
  • 你有一个多余的try/catch。您可以只使用 return api.connect(params) 并将 try/catch 保留在呼叫站点周围 (let result = await registerUser)

标签: javascript react-native asynchronous async-await


【解决方案1】:

感谢@Safder、@ftrsk 和 @jnpdx

我需要在第一个函数上使用 try catch,第二个不需要异步。

async function Signin({ email, pass, confirmpass, }) {
  try {
    var result = await registerUser({ email, pass, confirmpass, });
    console.log(result);
  } catch {

  }
  
}

function registerUser({ email, pass, confirmpass, }) {
  const body = {
    'email': email,
    'pass': pass,
    'confirmpass': confirmpass,
  };
  const params = {
    endpoint: 'register_user',
    method: 'post',
    headers: null,
    body: body
  }

  return api.connect(params);
}

【讨论】:

    【解决方案2】:

    问题是你没有等待 api.connect(params) 执行。始终确保将 await 放在异步函数之前。您可以通过放置来解决第二个代码块中的问题

    const result = await api.connect(params)
    return result

    甚至

    return await api.connect(params)

    【讨论】:

    • 如果我这样做,VS Code 会返回此消息: Redundant use of await on a return value.sonarlint(javascript:S4326)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2021-06-16
    • 2021-04-13
    • 1970-01-01
    • 2018-04-20
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多