Подождите, пока все функции asyn c внутри карты завершатся выполнением sh - PullRequest
0 голосов

Я хочу завершить sh выполнение ВСЕ асинхронных c функций внутри карты, а затем изменить состояние моего компонента. Я оставляю вам сокращенную часть кода на случай, если вы можете мне помочь.

Все, что я пытаюсь сделать, - это показывать свой собственный экран разрешений каждый раз, когда пользователь отменяет его.

Чтобы Упростите, у меня есть это:

const permissions = {
    cameraRoll: {
        iconType: "ionicon",
        iconName: "ios-images",
        title: "Enable camera roll",
        subtitle:
          "To upload content from your Gallery, you have to granted the camera roll permission",
        buttonText: "Enable camera roll",
        checkPermission: checkCameraRollPermission,
        requirePermission: requireCameraRollPermission,
      },
    };
}


const checkCameraRollPermission = async () => {
    const { status, canAskAgain } = await Permissions.getAsync(
      Permissions.CAMERA_ROLL
    );
    return { status, canAskAgain };
  };


  const requireCameraRollPermission = async () => {
    const { status, canAskAgain } = await Permissions.askAsync(
      Permissions.CAMERA_ROLL
    );
    return { status, canAskAgain };
  };


/* I HAVE TO WAIT FOR ALL THE FUNCTIONS TO FINISH EXECUTION
FOR EACH OBJECT ON THE MAP BUT THIS IS NOT WORKING :( */
getMissingPermissions = () => {
    // Only check permissions on the foreground
    if (AppState.currentState.match(/active/)) {
      // We have to empty the current missing permssions and recalculate them
      const permissionsArray = [];
      Promise.all(
        Object.keys(permissions).map((key) => {
          permissions[key].checkPermission().then(({ status }) => {
            if (status !== "granted") {
              permissionsArray.push(permissions[key]);
            }
          });
        })
      ).then(() => {

        this.setState({
          missingPermissions: permissionsArray,
        });
      });
    }
  };

Есть идеи? Спасибо

1 Ответ

1 голос
/ 26 мая 2020

С Promise.all вам нужно предоставить обещания в виде массива. В настоящее время вы ничего не возвращаете из карты, что и является причиной проблемы.

Также вместо использования переменной permissionsArray вы можете просто вернуть требуемое значение из вложенного обещания, и оно будет доступно в Promise.all(...).then(...) ответ

getMissingPermissions = () => {
    // Only check permissions on the foreground
    if (AppState.currentState.match(/active/)) {
      // We have to empty the current missing permssions and recalculate them
      Promise.all(
        Object.keys(permissions).map((key) => {
          return permissions[key].checkPermission().then(({ status }) => {
            if (status !== "granted") {
              return permissions[key];
            }
            return;
          });
        })
      ).then((res) => {
        const permissionsArray = res.filter(Boolean)// Filter out undefined values
        this.setState({
          missingPermissions: permissionsArray,
        });
      });
    }
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...