Javascript 如果在非异步函数中调用'AsyncStorage.setItem'而不等待,会发生什么情况?

Javascript 如果在非异步函数中调用'AsyncStorage.setItem'而不等待,会发生什么情况?,javascript,react-native,asynchronous,promise,Javascript,React Native,Asynchronous,Promise,我正在使用fetch方法从服务器获取一些数据。一旦我得到了这些数据,我需要将其中的一些存储在AsyncStorage中(更准确地说,因为我使用的是oauth,所以需要访问\u令牌)。我试着只做AsyncStorage.setItem而不等待,而不是它在中的显示方式,并且工作得很好 我把它改成: fetch ('site/login', POST ...) .then((response) => response.json()) .then(async(responseJson) =>

我正在使用
fetch
方法从服务器获取一些数据。一旦我得到了这些数据,我需要将其中的一些存储在
AsyncStorage
中(更准确地说,因为我使用的是oauth,所以需要访问\u令牌)。我试着只做
AsyncStorage.setItem
而不等待,而不是它在中的显示方式,并且工作得很好

我把它改成:

fetch ('site/login', POST ...)
.then((response) => response.json())
.then(async(responseJson) => {
   if (user.valid)
    await AsyncStorage.setItem('access_token', responseJson.token);
而且效果也不错。但我现在有两个问题:

我的fetch和async实现是否正确

如果在这种情况下不使用wait/async,会发生什么


很抱歉,我对Javascript中的承诺和异步方法有点陌生。谢谢

async/await
只是语法上的甜言蜜语,而不是承诺。你已经在使用承诺,所以没有必要这么做。只要回报承诺:

fetch ('site/login', POST ...)
.then((response) => response.json())
.then((responseJson) => {
  if (user.valid) { // not sure where 'user' came from, but whatever
    return AsyncStorage.setItem('access_token', responseJson.token);
  } else {
    throw new Error('Invalid user');
  }
})
.then(_ => { // storage set, don't care about return value
  // do stuff
})
.catch((err) => {
  // handle error, including invalid user
});
对评论中问题的答复 上面在async/await中的代码如下所示:

async function foo() {
  try {
    const response = await fetch('site/login', POST ...);
    const responseJson = await response.json();
    if (user.valid) {
      return await AsyncStorage.setItem('access_token', responseJson.token);
    } else {
      throw new Error('Invalid user');
    }
  } catch (error) {
    // deal with errors
  }
}

async/await
只是语法上的甜言蜜语。你已经在使用承诺,所以没有必要这么做。只要回报承诺:

fetch ('site/login', POST ...)
.then((response) => response.json())
.then((responseJson) => {
  if (user.valid) { // not sure where 'user' came from, but whatever
    return AsyncStorage.setItem('access_token', responseJson.token);
  } else {
    throw new Error('Invalid user');
  }
})
.then(_ => { // storage set, don't care about return value
  // do stuff
})
.catch((err) => {
  // handle error, including invalid user
});
对评论中问题的答复 上面在async/await中的代码如下所示:

async function foo() {
  try {
    const response = await fetch('site/login', POST ...);
    const responseJson = await response.json();
    if (user.valid) {
      return await AsyncStorage.setItem('access_token', responseJson.token);
    } else {
      throw new Error('Invalid user');
    }
  } catch (error) {
    // deal with errors
  }
}

您上面提到的实现是正确的。如果在本例中不使用wait/async,则会得到Promise子句的结果。建议:阅读承诺,特别是关于链接承诺的内容(.then()可能会返回另一个承诺或非承诺结果,并且处理过程会有所不同)。它还将真正有助于理解
async/await
是如何工作的。p、 这将更好地解释为什么在chained
的内部不需要异步/等待。pps承诺非常有趣,如果你不想等待,你可以。但通常,调用方可能希望在完成函数后,令牌会保存在存储器中,依赖于此的代码可能会中断。您上面提到的实现是正确的。如果在本例中不使用wait/async,则会得到Promise子句的结果。建议:阅读承诺,特别是关于链接承诺的内容(.then()可能会返回另一个承诺或非承诺结果,并且处理过程会有所不同)。它还将真正有助于理解
async/await
是如何工作的。p、 这将更好地解释为什么在chained
的内部不需要异步/等待。pps承诺非常有趣,如果你不想等待,你可以。但是,通常您的调用者可能会期望在您的函数完成后,令牌会保存在存储器中,依赖于此的代码可能会中断。非常感谢!如果我没有承诺呢?“如果不等待,它会不会起作用?”晚安更新了我的答案。您别无选择,只能使用承诺,因为这就是
fetch
response.json()
等返回的内容,但您可以使用
async/await
对它们进行糖化。但它仍然是隐藏在幕后的承诺,
foo
将永远回报一个承诺。非常感谢!如果我没有承诺呢?“如果不等待,它会不会起作用?”晚安更新了我的答案。您别无选择,只能使用承诺,因为这就是
fetch
response.json()
等返回的内容,但您可以使用
async/await
对它们进行糖化。但它仍然是隐藏在幕后的承诺,
foo
总是会回报一个承诺。