JavaScript回调函数是怎么实现非阻塞的?

代码如下:

function Breakfast() {
  var str = 'breakfast';
  console.log('Having breakfast');
  // 使用回调函数
  eat(str, function() {
    console.log('Finished ! Time to go to work!' + str);
  });
}


function Lunch() {
  var str = 'lunch';
  console.log('Having Lunch');
  // 使用回调函数
  eat(str, function() {
    console.log('Finished ! Time to go to work!' + str);
  });
}

function eat(str, callback) {
  (function() {
    var start = new Date().getTime();
    // 这里让它等待两秒才继续执行后续代码
    while ((new Date().getTime() - start) < 2000) {}
  }());
  // 等待2秒后才执行
  callback(str);
}


Breakfast();
Lunch();
  • 运行结果:
    Having breakfast
    Finished ! Time to go to work!breakfast
    Having Lunch
    Finished ! Time to go to work!lunch

问题:我在eat函数中用了一个while循环,让他等待两秒再继续执行回调函数,如果是非阻塞的话,应该就不会等待而是直接输出下一段的Having Lunch才对吧?? 所以按照回调函数非阻塞,结果应该是:
Having breakfast
Having Lunch
Finished ! Time to go to work!breakfast
Finished ! Time to go to work!lunch
真的没弄明白JS回调函数和非阻塞是怎么实现的。如果要做到上述的输出结果,代码应该怎么改,能做到吗?

阅读 3k
1 个回答

你搞错了几件事情。 回调和异步没有关系,异步跟阻塞非阻塞也没有关系。

// 同步回调
function async (callback){
    callback()
}
// 异步回调
function sync (callback) {
    setTimeout(callback, 500)
}
// 同步非阻塞
function noBlock () {
    // 这一段是伪代码 不要当真
    // 另起一个线程处理工作
    // thread.run()
    // 但是当前函数会直接返回,并不会直接返回想要的结果
    // 然后后续可能需要去查查这个任务做的咋样了
    return 'doing'
}
这几个概念你可以自由组合,不过 js 里好像没同步非阻塞和异步阻塞。

node 底层非阻塞是使用的线程池实现的(依赖系统,不管是 windows 还是 *nix 平台)。就好比将你的 while 循环扔到另一个线程去执行,不会阻塞当前线程的js的执行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题