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);
});
添加回答
舉報