为了账号安全,请及时绑定邮箱和手机立即绑定

如何为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 关注
  • 756 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信