Мой код:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
И когда я пытаюсь запустить что-то вроде этого:
let userToken = AuthUser(data)
console.log(userToken)
Я собираюсь:
Promise { <pending> }
Но почему?
Моя основная цель - получить токен, из google.login(data.username, data.password)
которого возвращается обещание, в переменную. И только после этого выполните некоторые действия.
getFirstUser
функциюОтветы:
Обещание всегда будет записываться в состояние ожидания, пока его результаты еще не разрешены. Вы должны вызвать
.then
обещание для захвата результатов независимо от состояния обещания (разрешено или все еще ожидает выполнения):Это почему?
Обещания - это только прямое направление; Вы можете решить их только один раз. Разрешенное значение a
Promise
передается его.then
или.catch
методам.подробности
Согласно спецификации Promises / A +:
Эту спецификацию немного сложно разобрать, поэтому давайте разберемся с ней. Правило такое:
Если функция в
.then
обработчике возвращает значение, тоPromise
разрешается с этим значением. Если обработчик возвращает другойPromise
, то исходныйPromise
разрешается с разрешенным значением связанногоPromise
. Следующий.then
обработчик всегда будет содержать разрешенное значение связанного обещания, возвращенного в предыдущем.then
.Как это работает на самом деле, более подробно описано ниже:
1. Возврат
.then
функции будет разрешенным значением обещания.2. Если
.then
функция возвращает aPromise
, то разрешенное значение этого связанного обещания передается следующему.then
.источник
Uncaught SyntaxError: Unexpected token .
, Вторую нужно вернуть заPromise
.then
использовать невызванную функцию. обновил ответЯ знаю, что этот вопрос был задан 2 года назад, но я столкнулся с той же проблемой, и ответ на эту проблему с ES6, что вы можете просто
await
возвращать значение функции, например:источник
.then(token => return token)
, это просто ненужный переход. Просто верните вызов входа в Google.await
вне асинхронной функции. Возможно, лучшим примером здесь было бы созданиеAuthUser
функцииasync
, которая затем заканчивается наreturn await google.login(...);
then
Метод возвращает ожидающее обещание , которое может быть решено асинхронно возвращаемым значением результирующего обработчика , зарегистрированным в вызовеthen
, или отвергнут метание ошибки внутри обработчика вызывается.Таким образом, вызов
AuthUser
не будет внезапно регистрировать пользователя в синхронном режиме, но возвращает обещание, зарегистрированные обработчики которого будут вызываться после успешного (или неудачного) входа в систему. Я бы предложил запускать всю обработку входа в систему с помощьюthen
пункта обещания входа в систему. EG использует именованные функции для выделения последовательности потока:источник
См. Раздел MDN об обещаниях. В частности, посмотрите на возвращаемый тип then ().
Чтобы войти в систему, пользовательский агент должен отправить запрос на сервер и дождаться ответа. Поскольку полное прекращение выполнения вашего приложения во время передачи запроса туда и обратно обычно ухудшает взаимодействие с пользователем, практически каждая функция JS, которая выполняет вход в систему (или выполняет любую другую форму взаимодействия с сервером), будет использовать обещание или что-то очень похожее на него. , чтобы предоставлять результаты асинхронно.
Также обратите внимание, что
return
операторы всегда оцениваются в контексте функции, в которой они появляются. Итак, когда вы написали:это утверждение
return token;
означало, что анонимная функцияthen()
должна возвращать токен, а неAuthUser
функция. То, чтоAuthUser
возвращается, является результатом вызоваgoogle.login(username, password).then(callback);
, который оказывается обещанием.В конечном итоге ваш обратный вызов
token => { return token; }
ничего не делает; вместо этого ваш вводthen()
должен быть функцией, которая действительно каким-то образом обрабатывает токен.источник
return
обрабатывается новый (ish) синтаксис закрытия, и в этом случае - ну, я категорически не одобряю этого, но ошибка все еще моя, и я извиняюсь за нее.token => { return token; }
она ничего не делает, а не утверждает, что она контрпродуктивна. Вы можете говоритьgoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
и так далее до бесконечности, но вы получите только возвращение,Promise
которое разрешается с помощью токена - так же, как если бы вы просто оставили его какgoogle.login(username, password);
. Я не уверен, почему вы считаете, что это «очень неправильно».return token
не работает так, как, вероятно, ожидал OP.promise.then(result => { return result; })
точности эквивалентноpromise
, поэтому вызов метода ничего не делает, и его следует отбросить, чтобы упростить код и повысить удобочитаемость - утверждение, которое полностью верно.Ваше обещание ожидается, завершите его
после вашего оставшегося кода. Все, что делает этот код, это то, что
.then()
выполняет ваше обещание и фиксирует конечный результат в переменной результата и выводит результат в консоль. Имейте в виду, что вы не можете сохранить результат в глобальной переменной. Надеюсь, это объяснение поможет вам.источник