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。
您应该对事件循环进行一些阅读。
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");
这个将是异常的异步。这应该是好的将在异步完成之前写入。
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);
});
添加回答
举报