如何为Node.js编写异步函数

我试图研究应该如何编写完全异步的函数。经过大量文档的大量工作后,我仍然不清楚。


如何为Node编写异步函数?我该如何正确实现错误事件处理?


问我问题的另一种方法是:我应该如何解释以下功能?


var async_function = function(val, callback){

    process.nextTick(function(){

        callback(val);

    });

};

另外,我在SO上发现了这个问题(“如何在node.js中创建非阻塞异步函数?”)。我觉得它还没有得到回答。


长风秋雁
浏览 757回答 3
3回答

蝴蝶不菲

您似乎将异步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。您应该对事件循环进行一些阅读。

宝慕林4294392

仅通过回调是不够的。例如,您必须使用settimer来使函数异步。示例:不是异步函数:function a() {&nbsp; var a = 0;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0; i<10000000; i++) {&nbsp; &nbsp; a++;&nbsp; };&nbsp; b();};function b() {&nbsp; var a = 0;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0; i<10000000; i++) {&nbsp; &nbsp; a++;&nbsp; };&nbsp; &nbsp;&nbsp;&nbsp; c();};function c() {&nbsp; for(i=0; i<10000000; i++) {&nbsp; };&nbsp; console.log("async finished!");};a();console.log("This should be good");如果你将运行上面的例子,这应该是好的,将不得不等待,直到这些功能将完成工作。伪多线程(异步)函数:function a() {&nbsp; setTimeout ( function() {&nbsp; &nbsp; var a = 0;&nbsp;&nbsp;&nbsp; &nbsp; for(i=0; i<10000000; i++) {&nbsp; &nbsp; &nbsp; a++;&nbsp; &nbsp; };&nbsp; &nbsp; b();&nbsp; }, 0);};function b() {&nbsp; setTimeout ( function() {&nbsp; &nbsp; var a = 0;&nbsp;&nbsp;&nbsp; &nbsp; for(i=0; i<10000000; i++) {&nbsp; &nbsp; &nbsp; a++;&nbsp; &nbsp; };&nbsp;&nbsp;&nbsp; &nbsp; c();&nbsp; }, 0);};function c() {&nbsp; setTimeout ( function() {&nbsp; &nbsp; for(i=0; i<10000000; i++) {&nbsp; &nbsp; };&nbsp; &nbsp; console.log("async finished!");&nbsp; }, 0);};a();console.log("This should be good");这个将是异常的异步。这应该是好的将在异步完成之前写入。

蛊毒传说

试试这个,它适用于节点和浏览器。isNode = (typeof exports !== 'undefined') &&(typeof module !== 'undefined') &&(typeof module.exports !== 'undefined') &&(typeof navigator === 'undefined' || typeof navigator.appName === 'undefined') ? true : false,asyncIt = (isNode ? function (func) {&nbsp; process.nextTick(function () {&nbsp; &nbsp; func();&nbsp; });} : function (func) {&nbsp; setTimeout(func, 5);});
打开App,查看更多内容
随时随地看视频慕课网APP