Почему в связанном обещании второе обещание выполняется раньше первого?

Я использую этот поток авторизации, чтобы получить токен доступа для API Spotify. Первое обещание в этом наборе цепочек обещаний устанавливает access_token, если нет ошибки, где ошибка регистрируется в консоли. Второе обещание просто распечатывает недавно установленный токен доступа. Я думал, что этот код предотвратит выполнение кода внутри второго .then() до тех пор, пока не будет разрешено первое обещание.

console.info("PRE ACCESS TOKEN: " + spotifyApi.getAccessToken())

spotifyApi.clientCredentialsGrant().then(
  function(data) {
    console.info("The access token expires in " + data.body["expires_in"]);
    console.info("The access token is " + data.body["access_token"]);

    // Save the access token so that it's used in future calls
    spotifyApi.setAccessToken(data.body["access_token"]);
  },

  function(err) {
    console.info(
      "Something went wrong when retrieving an access token",
      err.message
    );
  }
).then( 
    console.info("POST ACCESS TOKEN: " + spotifyApi.getAccessToken())
); 

Но я получаю этот вывод:

PRE ACCESS TOKEN: undefined
POST ACCESS TOKEN: undefined  

Это означает, что второе обещание во втором .then() выполняется до первого обещания. Почему это происходит? Я думаю, что у меня, вероятно, есть фундаментальное непонимание того, как работают промисы в Javascript, но я не уверен, что именно я не понимаю.

afaik, вам нужно что-то вернуть в первом выражении then, затем связать другое, или вы можете сделать первое then функционирующим асинхронным, чтобы оно возвращало обещание, а позже, как только оно будет разрешено, оно вызовет второе then function.

Daksh Miglani 22.02.2019 05:25

@DakshMiglani Да, возвращая что-то из первого, оператор работает. Но wdym, сделав первую функцию асинхронной? Как бы я это сделал?

Jeremy Hadfield 22.02.2019 05:33

асинхронная функция возвращает обещание, поэтому вы просто добавляете ключевое слово async перед function примерно так: async function gg() { do_something_here; }. когда вы вызываете эту функцию, она возвращает обещание.

Daksh Miglani 22.02.2019 05:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта строка не связывает обещание

.then( 
    console.info("POST ACCESS TOKEN: " + spotifyApi.getAccessToken())
); 

Вы передаете функцию обещанию, чтобы обещание могло вызвать функцию после завершения.

Передайте функцию, и она должна начать работать

.then(function() { 
    console.info("POST ACCESS TOKEN: " + spotifyApi.getAccessToken())
}); 

Благодарность! в этом есть смысл. ясно, что мне нужно сделать больше, чем просто просмотреть документы обещания.

Jeremy Hadfield 22.02.2019 05:30

Другие вопросы по теме