一个实际的代码示例应该如何构造以避免callback地狱?

我一直在JavaScript代码中遇到callback地狱,我相信这是由我以前的经验主要是纯同步/线程Java代码。

我通过例子很好地学习,但到目前为止,还没有find一个很好的“之前和之后”的callback地狱的例子,在我发现它发生的许多情况下解决。

如果某种灵魂能够告诉我下面提供的代码应该是什么样的结构,以避免callback地狱(如果需要的话,使用asynchronous库等),我将不胜感激,因为我相信一个实际的例子会使我和其他人阅读这个问题。

在这一段时间里,我仍然无法find一个好的方法,可以调用原始的callback函数,也可以保留代码的逻辑。

任何帮助,如果很好的赞赏,谢谢你的时间。 🙂

代码:var fs = require('fs'); var zlib = require('zlib');

var defaultOptions = require('./options/defaults'); function FeatherDB (sourcePath, options) { if (options === undefined) { // use defaults if options not provided options = defaultOptions; } else { // ensure all keys are supplied for (key in defaultOptions) { if (options[key] === undefined) { options[key] = defaultOptions[key]; } } } this.sourcePath = sourcePath; this.options = options; } FeatherDB.prototype.load = function (callback) { var thiz = this; fs.exists(this.sourcePath, function (error, doesExist) { if (error) { callback(error); return; } if (doesExist) { fs.readFile(thiz.sourcePath, function (error, rawFileData) { if (error) { callback(error); return; } if (thiz.options.compress) { zlib.gunzip(rawFileData, function (error, rawUncompressedData) { if (error) { callback(error); return; } try { thiz.documents = JSON.parse(rawUncompressedData.toString('utf8')); } catch (error) { callback(error); return; } callback(null); }) } else { try { thiz.documents = JSON.parse(rawFileData.toString('utf8')); } catch (error) { callback(error); return; } callback(null); } }) } else { thiz.documents = {}; callback(null); } }) } 

fs.exists格式化,并删除fs.exists检查。 如果该文件不存在,则readFile将失败并返回错误。

 FeatherDB.prototype.load = function (callback) { var thiz = this; fs.readFile(thiz.sourcePath, function (error, rawFileData) { if (error) { thiz.documents = {}; return callback(error); } if (!thiz.options.compress) { FeatherDB.parse(rawFileData.toString('utf-8'), callback); return; } zlib.gunzip(rawFileData, function (error, rawUncompressedData) { if (error) { return callback(error); } FeatherDB.parse(rawUncompressedData.toString('utf-8'), callback); }); }); } FeatherDB.prototype.parse(data, callback) { try { thiz.documents = JSON.parse(data); } catch (error) { return callback(error); } callback(); } 

如果你开始做更多的嵌套的东西,你可以看看使用asynchronous 。*function,如瀑布,系列,并行等。