在使用错误回异步函数时,避免 Node 中回调地狱的常见做法是什么.JS?



我是 Node 的新手,我现在正在尝试在没有第三方 npm 包的情况下练习纯 Node 脚本。我遇到的第一个问题是我的代码开始看起来像>符号。我的意思是我在回调中的回调中有回调,依此类推......像这样:

fs.open(‘filename.json’, 'wx', (error, fileDescriptor) => {
if (!error && fileDescriptor) {
// Do something with the file here ...
fs.writeFile(fileDescriptor, newData, (error) => {
if (!error) {
fs.close(fileDescriptor, (error) => {
if (!error) {
callback(false);
} else {
callback('Error closing the file');
}
});
} else {
callback('Error writing to new file');
}
});
} else {
callback('Could not create new file, it may already exists');
}
});

这是一个简单的例子,但我们可能有更复杂的逻辑,可能包括更多的异步步骤,从而包括更深层次的回调。尽管我在上面的示例中使用了fs模块,但探索仍然更通用。当使用其他模块时,我们可能会遇到这种回调情况(即zlib.gzip(str, callback)(。

所以我的问题是,我们是否有任何常见的做法来避免这种回调内部回调代码,并使其看起来更直接和可读,同时保持异步?

我想可以将代码拆分为更精细的模块,并且在同一个地方没有很多多级异步逻辑。我也猜有一些像异步这样的软件包可能会有所帮助。但是,仍然有任何通用的语言实践/结构可以使这种回调内部回调代码更加扁平,而无需使用外部帮助程序?

防止回调内部回调情况的方法之一是(如评论线程中所述(使用Promiseasync/await语句。这将使异步代码结构更加扁平。为此,可以使用一个方便的util.promisify(original(功能。它允许我们从回调切换到承诺。看看下面fs函数的示例:

// Dependencies.
const util = require('util');
const fs = require('fs');
// Promisify "error-back" functions.
const fsOpen = util.promisify(fs.open);
const fsWrite = util.promisify(fs.writeFile);
const fsClose = util.promisify(fs.close);
// Now we may create 'async' function with 'await's.
async function doSomethingWithFile(fileName) {
const fileDescriptor = await fsOpen(fileName, 'wx');

// Do something with the file here...

await fsWrite(fileDescriptor, newData);
await fsClose(fileDescriptor);
}

回调,特别是,已经在注释中使用了 Promises 来解决。

您遇到的另一个问题与回调关系不大,而与倒置条件块有关。 尝试翻转if块。 像这样的东西...

fs.open('filename.json', 'wx', (error, fileDescriptor) => {
if (error) {
return callback(error);
}
// Do something with the file
fs.writeFile(fileDescriptor, newData, (error) => {
if (error) {
return callback(error);
}
fs.close(fileDescriptor, (error) => {
//  etc...
});
});
});

最新更新