if语句中的功能后,Node.js的执行不会继续

时间:2018-08-04 12:16:46

标签: javascript node.js if-statement

此代码段将执行到 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

1 个答案:

答案 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();
    })
  })
}