Я использую этот поток авторизации, чтобы получить токен доступа для 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, но я не уверен, что именно я не понимаю.
@DakshMiglani Да, возвращая что-то из первого, оператор работает. Но wdym, сделав первую функцию асинхронной? Как бы я это сделал?
асинхронная функция возвращает обещание, поэтому вы просто добавляете ключевое слово async перед function примерно так: async function gg() { do_something_here; }. когда вы вызываете эту функцию, она возвращает обещание.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Эта строка не связывает обещание
.then(
console.info("POST ACCESS TOKEN: " + spotifyApi.getAccessToken())
);
Вы передаете функцию обещанию, чтобы обещание могло вызвать функцию после завершения.
Передайте функцию, и она должна начать работать
.then(function() {
console.info("POST ACCESS TOKEN: " + spotifyApi.getAccessToken())
});
Благодарность! в этом есть смысл. ясно, что мне нужно сделать больше, чем просто просмотреть документы обещания.
afaik, вам нужно что-то вернуть в первом выражении then, затем связать другое, или вы можете сделать первое then функционирующим асинхронным, чтобы оно возвращало обещание, а позже, как только оно будет разрешено, оно вызовет второе then function.