如何在then()中使用异步函数?

时间:2020-03-03 12:37:01

标签: javascript reactjs react-native

我需要使AsyncStorage setItem仅在诺言(然后)完成后运行。

  viewShot.current.capture().then(uri => {
    page = uri;

    //---------------------------------------------------
      try {
        const dataSave = {
          key: '1',
          title: 'Page One',

        };
        pagina.pushScreen.push(dataSave);
        await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
        // alert('Página Salva!');
      } catch (e) {
        alert('Erro ao salvar página');
      }
      //-----------------------------------------------------

  });

enter image description here

2 个答案:

答案 0 :(得分:0)

看看await的下划线是如何引起错误的?将鼠标悬停在它上面并读取错误。

您只能在async不是的uri => { ... }函数内部等待。

将其标记为异步:

then( async (uri) => { ... } );

更好的是,首先不要使用then

// Needs to be inside an `async` function!
const uri = await viewShot.current.capture();
try {
   const dataSave = {
   // etc

答案 1 :(得分:0)

如果您使用的是async / await语法,则通常根本不使用then

const page = await viewShot.current.capture();
try {
  const dataSave = {
    key: '1',
    title: 'Page One',

  };
  pagina.pushScreen.push(dataSave);
  await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
  // alert('Página Salva!');
} catch (e) {
  alert('Erro ao salvar página');
}

如果,您正在非then函数中使用async,并希望继续这样做(而不是使其成为async,那么您可以使用await),可以将async函数传递给then

viewShot.current.capture.then(async (page) => {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^
  try {
    const dataSave = {
      key: '1',
      title: 'Page One',

    };
    pagina.pushScreen.push(dataSave);
    await AsyncStorage.setItem('@pages', JSON.stringify(pagina));
    // alert('Página Salva!');
  } catch (e) {
    alert('Erro ao salvar página');
  }
});

由于async函数返回了诺言,并且允许执行处理程序返回诺言,以便将then中的诺言解析为处理程序中的诺言,这样就可以了。


侧面说明:引用的代码似乎违反了承诺的基本规则之一:它不能处理对原始承诺的拒绝,也不能将承诺从then返回到其他任何东西可以处理这种拒绝。规则是:处理拒绝,或将promise链返回到可以的东西。