Асинхронное ожидание с обещаниями, затем требуется блокировка - PullRequest
0 голосов
/ 21 декабря 2018

Как в принципе асинхронно ждать правильно?Я создал помощника для AsyncStorage, который автоматически ожидает async, но должны ли пользователи этого использовать async await или обещать подход для получения значения?

Этот код работает, но не может правильно использовать синтаксис.

вот мой код:

class AsyncStorageHelper {
  static getItem = async (key: string) => {
    let value: any = "";
    try {
      value = await AsyncStorage.getItem(key);
    } catch (error) {
      console.log(`Error item: ${value}`);
      throw new Error(`Error ${value}`);
    }
    return value;
  };
}

AsyncStorageHelper.getItem("logins")
  .then(result => {
    if (result) {
      if (result === "1") {
        navigate(SCREEN1);
      } else {
        navigate(SCREEN2);
      }
    }
  })
  .catch(err => {
    navigate(LOGINSCREEN);
  });

Как я могу преобразовать код AsyncStorageHelper в асинхронное ожидание, так как в зависимости от результата я хочу перейти в разные места.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

await должен использоваться внутри асинхронной функции.

async function helper() {
  try {
    const result = await AsyncStorageHelper.getItem("logins");

    if (result) {
      if (result === "1") {
        navigate(SCREEN1);
      } else {
        navigate(SCREEN2);
      }
    }
  } catch (error) {
    navigate(LOGINSCREEN);
  }
}

helper()
0 голосов
/ 21 декабря 2018
class AsyncStorageHelper {

  static async getItem(key : string) {
    let value: any = ""
    try {
      value = await AsyncStorage.getItem(key)
    } catch (error) {
      console.log(`Error item: ${value}`)
      throw new Error(`Error ${value}`)
    }
    return value
  }
}

try {
  const result = await AsyncStorageHelper.getItem("logins")

  if (result)
    (result === "1") ? navigate(SCREEN1): navigate(SCREEN2)

} catch(err) {
  navigate(LOGINSCREEN)
}
0 голосов
/ 21 декабря 2018

Асинхронные функции и функцию возврата обещания могут использоваться внешне таким же образом.

AsyncStorageHelper.getItem("logins")
  .then(result => {
    if (result) {
      if (result === "1") {
        navigate(SCREEN1);
      } else {
        navigate(SCREEN2);
      }
    }
  })
  .catch(err => {
    navigate(LOGINSCREEN);
  });

То же, что и:

// note: this code must run in another async function
// so we can use the keyword await
try {
  const result = await AsyncStorageHelper.getItem("logins");
  if (result) {
    if (result === "1") {
      navigate(SCREEN1);
    } else {
      navigate(SCREEN2);
    }
  }
} catch (err) {
  navigate(LOGINSCREEN);
}

Примечание: ваш код содержит неизвестный коддорожка.Что происходит, когда AsyncStorageHelper.getItem("logins") возвращает ложное значение?По сути, у вас есть noop, и это может быть нежелательным поведением.

...