Javascript Node.js执行不';在if语句中函数之后不继续
这段代码将一直执行到Javascript Node.js执行不';在if语句中函数之后不继续,javascript,node.js,if-statement,Javascript,Node.js,If Statement,这段代码将一直执行到getRefreshToken函数的最后一行。播放歌曲功能未被触发。 我是否误解了JS的工作方式?现在,我已经在getRefreshToken函数的末尾包含了对play_song的调用,当然,这是可以预期的。然而,我很困惑为什么它不在if语句中一个接一个地执行函数 function checkTime () { var now = new Date(); if (now.getHours() == time[0] && now.getMinutes() =
getRefreshToken
函数的最后一行。播放歌曲
功能未被触发。
我是否误解了JS的工作方式?现在,我已经在getRefreshToken
函数的末尾包含了对play_song
的调用,当然,这是可以预期的。然而,我很困惑为什么它不在if语句中一个接一个地执行函数
function checkTime () {
var now = new Date();
if (now.getHours() == time[0] && now.getMinutes() == time[1]) {
getRefreshToken();
play_song();
}
}
getRefreshToken
的内容:
function getRefreshToken() {
console.log('Starting token request')
// requesting access token from refresh token
var refresh_token = tokens.refresh;
var authOptions = {
url: 'https://accounts.spotify.com/api/token',
headers: { 'Authorization': 'Basic ' + (new Buffer(client_id + ':' + client_secret).toString('base64')) },
form: {
grant_type: 'refresh_token',
refresh_token: refresh_token
},
json: true
};
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
tokens.access = body.access_token;
}
//play_song(); //only a temporary fix
})
}
是的,在JavaScript中,函数不一定像您在其他编程语言中熟悉的那样是同步的。JavaScript是单线程的,但是诸如获取数据、查询API、数据库、I/O等操作都与代码的主执行并行进行 我假设
getRefreshToken()
正在发出某种网络请求,而您提到的play_song
在getRefreshToken()的末尾给出了它
在JavaScript中有很多方法可以解决这个问题
下面是一个针对您的情况的示例,为了示例的目的,我删除了一些不需要的代码:
// Using callbacks
function checkTime() {
getRefreshToken(play_song);
}
function getRefreshToken(callback) {
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
tokens.access = body.access_token;
}
callback();
})
}
// Using Promises
function checkTime() {
getRefreshToken()
.then(() => {
play_song();
})
}
function getRefreshToken(callback) {
return new Promise((resolve, reject) => {
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
tokens.access = body.access_token;
}
resolve();
})
})
}
// Using Async/Await
async function checkTime() {
await getRefreshToken()
play_song();
}
function getRefreshToken(callback) {
return new Promise((resolve, reject) => {
request.post(authOptions, function(error, response, body) {
if (!error && response.statusCode === 200) {
tokens.access = body.access_token;
}
resolve();
})
})
}
getRefreshToken()
的内容是什么?这两个方法之间的关系是什么?注释掉第一个后会发生什么?我添加了“getRefreshToken()”的内容。如果我把第一个注释掉,第二个就会正常执行。你没有发现任何错误吗?没有,我根本没有发现任何错误。谢谢你的回答。我理解,功能的执行顺序没有明确定义。然而,这两个函数是否都应该执行?@DustinWortmann是的,它们肯定都会执行。您是否能够逐行调试和遍历代码,并准确地看到发生了什么?或者到处乱扔一堆console.log。我已经有很多console.log了,但是根本没有得到“play_song()”的输出。不过,非常感谢您的详细回答。@DustinWortmann不用担心,很高兴它能起作用。还要注意嵌套多个回调并进入回调地狱;)