在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ JavaScript回調(diào)函數(shù)是怎么實(shí)現(xiàn)非阻塞的?

JavaScript回調(diào)函數(shù)是怎么實(shí)現(xiàn)非阻塞的?

代碼如下:

function Breakfast() {
  var str = 'breakfast';
  console.log('Having breakfast');
  // 使用回調(diào)函數(shù)
  eat(str, function() {
    console.log('Finished ! Time to go to work!' + str);
  });
}


function Lunch() {
  var str = 'lunch';
  console.log('Having Lunch');
  // 使用回調(diào)函數(shù)
  eat(str, function() {
    console.log('Finished ! Time to go to work!' + str);
  });
}

function eat(str, callback) {
  (function() {
    var start = new Date().getTime();
    // 這里讓它等待兩秒才繼續(xù)執(zhí)行后續(xù)代碼
    while ((new Date().getTime() - start) < 2000) {}
  }());
  // 等待2秒后才執(zhí)行
  callback(str);
}


Breakfast();
Lunch();
  • 運(yùn)行結(jié)果:
    Having breakfast
    Finished ! Time to go to work!breakfast
    Having Lunch
    Finished ! Time to go to work!lunch

問題:我在eat函數(shù)中用了一個(gè)while循環(huán),讓他等待兩秒再繼續(xù)執(zhí)行回調(diào)函數(shù),如果是非阻塞的話,應(yīng)該就不會(huì)等待而是直接輸出下一段的Having Lunch才對(duì)吧?? 所以按照回調(diào)函數(shù)非阻塞,結(jié)果應(yīng)該是:
Having breakfast
Having Lunch
Finished ! Time to go to work!breakfast
Finished ! Time to go to work!lunch
真的沒弄明白JS回調(diào)函數(shù)和非阻塞是怎么實(shí)現(xiàn)的。如果要做到上述的輸出結(jié)果,代碼應(yīng)該怎么改,能做到嗎?

回答
編輯回答
裸橙

你搞錯(cuò)了幾件事情。 回調(diào)和異步?jīng)]有關(guān)系,異步跟阻塞非阻塞也沒有關(guān)系。

// 同步回調(diào)
function async (callback){
    callback()
}
// 異步回調(diào)
function sync (callback) {
    setTimeout(callback, 500)
}
// 同步非阻塞
function noBlock () {
    // 這一段是偽代碼 不要當(dāng)真
    // 另起一個(gè)線程處理工作
    // thread.run()
    // 但是當(dāng)前函數(shù)會(huì)直接返回,并不會(huì)直接返回想要的結(jié)果
    // 然后后續(xù)可能需要去查查這個(gè)任務(wù)做的咋樣了
    return 'doing'
}
這幾個(gè)概念你可以自由組合,不過 js 里好像沒同步非阻塞和異步阻塞。

node 底層非阻塞是使用的線程池實(shí)現(xiàn)的(依賴系統(tǒng),不管是 windows 還是 *nix 平臺(tái))。就好比將你的 while 循環(huán)扔到另一個(gè)線程去執(zhí)行,不會(huì)阻塞當(dāng)前線程的js的執(zhí)行。

2017年9月6日 09:39