Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js执行不';在if语句中函数之后不继续_Javascript_Node.js_If Statement - Fatal编程技术网

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不用担心,很高兴它能起作用。还要注意嵌套多个回调并进入回调地狱;)