此代码段将执行到
a_field = models.foreignKey(~~,default=default_id.__func__,~~)
函数的末尾。 getRefreshToken
函数不会被触发。
我是否误解了JS的工作方式?目前,我已经在play_song
函数的末尾包含了对play_song
的调用,并且当然可以按预期运行。但是,我很困惑为什么它不只是在if语句中的一个函数一个接一个地执行。
getRefreshToken
function checkTime () {
var now = new Date();
if (now.getHours() == time[0] && now.getMinutes() == time[1]) {
getRefreshToken();
play_song();
}
}
的内容:
getRefreshToken
答案 0 :(得分:1)
是的,在JavaScript中,功能不一定像您在其他编程语言中所熟悉的那样是同步的。 JavaScript是单线程的,但是诸如获取数据,查询API,数据库,I / O等操作均与代码的主要执行并行发生。
我假设getRefreshToken()
发出了某种网络请求,而您提到的play_song
放在getRefreshToken()
末尾的事实就可以了。
有许多方法可以用JavaScript处理此问题,here's a good resource.
以下是您遇到的情况的示例,出于该示例的目的,我删除了一些不需要的代码:
// 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();
})
})
}