亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為Node.js編寫異步函數

如何為Node.js編寫異步函數

長風秋雁 2019-09-19 15:42:19
我試圖研究應該如何編寫完全異步的函數。經過大量文檔的大量工作后,我仍然不清楚。如何為Node編寫異步函數?我該如何正確實現錯誤事件處理?問我問題的另一種方法是:我應該如何解釋以下功能?var async_function = function(val, callback){    process.nextTick(function(){        callback(val);    });};另外,我在SO上發現了這個問題(“如何在node.js中創建非阻塞異步函數?”)。我覺得它還沒有得到回答。
查看完整描述

3 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

您似乎將異步IO與異步函數混淆。node.js使用異步非阻塞IO,因為非阻塞IO更好。理解它的最好方法是觀看ryan dahl的一些視頻。


如何為Node編寫異步函數?


只寫正常函數,唯一的區別是它們不是立即執行而是作為回調傳遞。


我該如何正確實現錯誤事件處理


通常API會給你一個帶有錯誤作為第一個參數的回調。例如


database.query('something', function(err, result) {

  if (err) handle(err);

  doSomething(result);

});

是一種常見的模式。


另一個常見的模式是on('error')。例如


process.on('uncaughtException', function (err) {

  console.log('Caught exception: ' + err);

});

編輯:


var async_function = function(val, callback){

    process.nextTick(function(){

        callback(val);

    });

};

調用上面的函數


async_function(42, function(val) {

  console.log(val)

});

console.log(43);

將42異步打印到控制臺。特別是process.nextTick在當前eventloop callstack為空后觸發。這調用堆棧是空后async_function和console.log(43)已經運行。所以我們打印43,然后是42。


您應該對事件循環進行一些閱讀。


查看完整回答
反對 回復 2019-09-19
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

僅通過回調是不夠的。例如,您必須使用settimer來使函數異步。


示例:不是異步函數:


function a() {

  var a = 0;    

  for(i=0; i<10000000; i++) {

    a++;

  };

  b();

};


function b() {

  var a = 0;    

  for(i=0; i<10000000; i++) {

    a++;

  };    

  c();

};


function c() {

  for(i=0; i<10000000; i++) {

  };

  console.log("async finished!");

};


a();

console.log("This should be good");

如果你將運行上面的例子,這應該是好的,將不得不等待,直到這些功能將完成工作。


偽多線程(異步)函數:


function a() {

  setTimeout ( function() {

    var a = 0;  

    for(i=0; i<10000000; i++) {

      a++;

    };

    b();

  }, 0);

};


function b() {

  setTimeout ( function() {

    var a = 0;  

    for(i=0; i<10000000; i++) {

      a++;

    };  

    c();

  }, 0);

};


function c() {

  setTimeout ( function() {

    for(i=0; i<10000000; i++) {

    };

    console.log("async finished!");

  }, 0);

};


a();

console.log("This should be good");

這個將是異常的異步。這應該是好的將在異步完成之前寫入。


查看完整回答
反對 回復 2019-09-19
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

試試這個,它適用于節點和瀏覽器。


isNode = (typeof exports !== 'undefined') &&

(typeof module !== 'undefined') &&

(typeof module.exports !== 'undefined') &&

(typeof navigator === 'undefined' || typeof navigator.appName === 'undefined') ? true : false,

asyncIt = (isNode ? function (func) {

  process.nextTick(function () {

    func();

  });

} : function (func) {

  setTimeout(func, 5);

});


查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 792 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號