Javascript Cognito понимает асинхронность и ждет? - PullRequest
0 голосов
/ 26 апреля 2019

Я вызываю эту функцию для получения пользовательского атрибута, однако, когда я тестирую функцию, возвращаемый результат всегда «test», а затем он проходит через «cognitoUser.getUserAttributes» и регистрирует фактический результат.Я не уверен, почему, но "cognitoUser.getUserAttributes", похоже, изначально пропускается.

при запуске выводит тест и вместо фактического результата

какие-либо идеи?

function retrieveattribute(e) {
  var ans = "test";
  var e = "custom:InstanceID_1";
  cognitoUser.getUserAttributes(function(err, result) {
    if (err) {
      alert(err);
      return;
    }
    for (i = 0; i < result.length; i++) {
      if (result[i].getName() == e) {
        ans = result[i].getValue();
        console.log(ans);
        return ans;
      }
    }
  });
  return ans;
}

1 Ответ

0 голосов
/ 26 апреля 2019

Для запуска "асинхронного кода" вам нужно обернуть свою функцию, чтобы пообещать:

function retrieveattribute(e) {
    return new Promise(function(res) {
        var ans = "test";
        var e = "custom:InstanceID_1";

        cognitoUser.getUserAttributes(function(err, result) {
            if (err) {
                alert(err);
                return;
            }
            for (i = 0; i < result.length; i++) {
                if (result[i].getName() == e) {
                    ans = result[i].getValue();
                    console.log(ans);
                    res(ans);
                }
            }
        });
    })
}

После этого вы можете использовать как обещание:

   retrieveattribute(e).then(t => console.log(t))

Или дождитесь асинхронной функции:

   await retrieveattribute(e)
...