2013-02-19 28 views
0

編輯:這似乎是不可能的,因爲createWriteStream()和其他錯誤發射器不一定會在下一個滴答發出錯誤,所以這個等待不能完成。實際上,如果我這意味着我想立即完成該過程,所以沒關係,如果我沒有得到任何錯誤。等到所有的回調被執行,然後退出


var fs = require ("fs"); 
var s; 

var init = function (cb){ 
    cb(); 
}; 

var shutdown = function (cb){ 
    cb (wait); 
}; 

var wait = function(){ 
    //Some kind of wait 
    process.exit(); 
}; 

init (function(){ 
    s = fs.createWriteStream ("?invalid").on ("error", console.error); //This emits an error 
}); 

shutdown (function (cb){ 
    s.on ("close", function (error){ 
     if (error) console.error (error); 
     cb(); 
    }); 
    s.end(); 
    cb(); 
}); 

如果執行此代碼,因爲印刷錯誤之前的過程結束後,你不會得到任何錯誤。如果更改wait()功能,這一點,是印刷

var wait = function(){ 
    //Some kind of wait 
    setTimeout (function(){ 
     process.exit(); 
    }, 1000); 
}; 

錯誤和1之後的過程結束。我想等待錯誤回調,然後退出而不設置計時器。我用nextTick()嘗試過,但不起作用。

回答

1

這裏是你想達到什麼樣的一個簡化版本:

var fs = require ("fs"); 
var s; 

var init = function (cb){ 
    cb(); 
}; 

var shutdown = function(error){ 
    console.log(error); 
    process.exit(); 
}; 

init(function(){ 

    s = fs.createWriteStream("?invalid"); 
    s.on("error", shutdown); 
    s.on ("close", shutdown); 

}); 
+0

只要注意不一定是無效的「無效?」。我不得不創建一個沒有寫入權限的文件來獲取錯誤。 – RayViljoen 2013-02-19 16:19:11

+0

我不能那樣做,因爲執行init和shutdown函數的代碼不是我的,它是用戶的代碼。其實,我發佈的例子是對我的問題的簡化。 – 2013-02-19 16:47:52

相關問題