Получение ролей участников от «wix-users»

Я пытался создать страницу, на которой отображаются разные элементы в зависимости от ролей участников разных пользователей. В настоящее время у меня есть две роли участников: по умолчанию «Участник» и новая роль «Спонсоры». Я получил роли участников, используя модуль wix-users как таковой.

import wixUsers from 'wix-users';

$w.onReady(function () {
    //TODO: write your page related code here...
    var roleName;
    let currentUser = wixUsers.currentUser;

    currentUser.getRoles()
    .then( (roles) => {
    var firstRole = roles[0];
    roleName = firstRole.name;                // "Role Name"
    console.log(roleName);
    var roleDescription = firstRole.description;  // "Role Description"
  }).catch(
      onFailure()
  );



  if(roleName === "Sponsors"){
      $w('#text13').show();
  }

});

Я знаю, что обещание от getRoles() разрешается на основе моей отладки, и console.log(roleName) правильно записывает "Спонсоры" в консоль, когда я вхожу в систему. Однако кажется, что оператор if if(roleName === "Sponsors") не запускается, что бы я ни делал. Что я делаю не так? Заранее спасибо!


person Shawn Lee    schedule 14.08.2018    source источник


Ответы (1)


Похоже, вы столкнулись с проблемой Promises. Функция getRoles() является асинхронной. Это означает, что он не возвращает значение сразу. Именно поэтому у него есть .then(). Код в .then() запускается только после того, как обещание, возвращенное getRoles(), преобразуется в значение.

Возможно, вы захотите ознакомиться с некоторыми ресурсами о промисах JavaScript. В Wix Code также есть статья, описывающая, как для работы с промисами, специально адаптированными для кода Wix.

Код, в котором вы проверяете, действительно ли roleName равен "Sponsors", запускается перед кодом, в котором вы устанавливаете значение roleName. Вот почему это не работает. Вам нужно вытащить этот код в файл .then().

currentUser.getRoles()
  .then( (roles) => {
     var firstRole = roles[0];
     roleName = firstRole.name;      
     if(roleName === "Sponsors"){
       $w('#text13').show();
  } );

В качестве альтернативы вы можете использовать async/await для работы с асинхронным кодом.

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

person Sam    schedule 14.08.2018
comment
Это сработало отлично! Веб-разработка и JS в целом для меня совершенно новые, большое спасибо :D - person Shawn Lee; 14.08.2018