理解承诺

Understanding promises

假设我有这个“伪”代码

static async fetchAuthData () {

        AsyncStorage.getItem('authtoken', (err, value) => AuthData.token = value)
            .then( (value) => {

                { ...Ok token fetched... }

            })
            .catch( (err) => { 
                return Promise.reject('Some sort of error');
            });

        AsyncStorage.getItem('userid', (err, value) => AuthData.userid = parseInt(value))
            .then( (value) => {

                { ...Ok userid fetched... }

            })
            .catch( (err) => { 
                return Promise.reject('Some sort of error');
            });

        if (token ok && userid ok ) {
            return Promise.resolve('ok');
        }
        else {
            return Promise.reject('Some sort of error');
        }

}

我假设 if (token ok && userid ok ) 在前两个承诺被解决或拒绝之前不会被执行。 我对吗?。 if (token ok && userid ok ) 有没有可能在我拿到令牌之前就被执行?

这个静态方法在我的应用程序的最开始被调用,这是我决定直接转到应用程序或导航到身份验证流程的地方。

文档似乎并没有明确说明这一点。

将 await 添加到 AsyncStorage 函数以暂停执行,直到 promise 得到解决并转到下一行

static async fetchAuthData () {

 await AsyncStorage.getItem('authtoken', (err, value) => AuthData.token = value)
        .then( (value) => {

            { ...Ok token fetched... }

        })
        .catch( (err) => { 
            return Promise.reject('Some sort of error');
        });

  await AsyncStorage.getItem('userid',(err, value) => AuthData.userid = parseInt(value))
        .then( (value) => {

            { ...Ok userid fetched... }

        })
        .catch( (err) => { 
            return Promise.reject('Some sort of error');
        });

    if (token ok && userid ok ) {
        return Promise.resolve('ok');
    }
    else {
        return Promise.reject('Some sort of error');
    }
}

您可以使用 async 和 await 来让代码以同步方式执行。 检查下面的代码,它的作用相同。

static async fetchAuthData () {
try{
   AuthData.token = await AsyncStorage.getItem('authtoken')
   userId = await AsyncStorage.getItem('userid')
   AuthData.userId = parseInt(userId)
   return true;
}catch(err){
   console.log(err)
   return false
}
}

如果出现任何错误,它将在 catch 块中被捕获,并从此处 return false。

正如@Amadan 所说,它将在您获得令牌之前执行 ,你需要等待所有的承诺,直到他们解决

    static async fetchAuthData () {  
      try {
          const [authtoken, userid] = await Promise.all([
            () => AsyncStorage.getItem('authtoken'),
            () => AsyncStorage.getItem('userid'),
          ]

          if (token ok && userid ok ) {
            return Promise.resolve('ok');
          }
        } catch(err) {
          // handle exception
        }
    }
static async fetchAuthData() {

  await new Promise((resolve, reject) => {
    AsyncStorage.getItem('authtoken', (err, value) => AuthData.token = value)
      .then((value) => {
        resolve('...Ok token fetched...')
      })
      .catch((err) => {
        reject('Some sort of error');
      });
  })

  await new Promise((resolve, reject) => {
    AsyncStorage.getItem('userid', (err, value) => AuthData.userid = parseInt(value))
      .then((value) => {
        resolve('...Ok token fetched...')
      })
      .catch((err) => {
        reject('Some sort of error');
      });
  })

  if (token ok && userid ok) {
    return Promise.resolve('ok');
  } else {
    return Promise.reject('Some sort of error');
  }

}