3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
您似乎將異步IO與異步函數(shù)混淆。node.js使用異步非阻塞IO,因?yàn)榉亲枞鸌O更好。理解它的最好方法是觀看ryan dahl的一些視頻。
如何為Node編寫異步函數(shù)?
只寫正常函數(shù),唯一的區(qū)別是它們不是立即執(zhí)行而是作為回調(diào)傳遞。
我該如何正確實(shí)現(xiàn)錯(cuò)誤事件處理
通常API會(huì)給你一個(gè)帶有錯(cuò)誤作為第一個(gè)參數(shù)的回調(diào)。例如
database.query('something', function(err, result) {
if (err) handle(err);
doSomething(result);
});
是一種常見的模式。
另一個(gè)常見的模式是on('error')。例如
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
編輯:
var async_function = function(val, callback){
process.nextTick(function(){
callback(val);
});
};
調(diào)用上面的函數(shù)
async_function(42, function(val) {
console.log(val)
});
console.log(43);
將42異步打印到控制臺(tái)。特別是process.nextTick在當(dāng)前eventloop callstack為空后觸發(fā)。這調(diào)用堆棧是空后async_function和console.log(43)已經(jīng)運(yùn)行。所以我們打印43,然后是42。
您應(yīng)該對(duì)事件循環(huán)進(jìn)行一些閱讀。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
僅通過回調(diào)是不夠的。例如,您必須使用settimer來使函數(shù)異步。
示例:不是異步函數(shù):
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");
如果你將運(yùn)行上面的例子,這應(yīng)該是好的,將不得不等待,直到這些功能將完成工作。
偽多線程(異步)函數(shù):
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");
這個(gè)將是異常的異步。這應(yīng)該是好的將在異步完成之前寫入。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
試試這個(gè),它適用于節(jié)點(diǎn)和瀏覽器。
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);
});
添加回答
舉報(bào)