我正在使用 Meteor 1.* 和 Iron Router 1.*。
我在 Meteor 的服务器端使用 Node.js 调用,在 Meteor 方法之外——特别是在服务器端 Iron Router 路由内。
到目前为止,路由内部的部分代码类似于以下内容:
fs.mkdir(filebox, function (e) {
if(!e || e.code === 'EEXIST') {
fs.writeFile(file1, function (err) {
if (err) throw err;
fs.writeFile(file2, function (err) {
if (err) throw err;
fs.writeFile(file.3, function (err) {
if (err) throw err;
ExternalLibrary.do_something_(file1, function (err, buffer) {
if (err) throw err;
ExternalLibrary.do_something_(file2, function (err, buffer) {
if (err) throw err;
ExternalLibrary.do_something_(file3, function (err, buffer) {
if (err) throw err;
some_object = { first: file1, second: file2 }
ExternalLibrary.do_something_else_(some_object, function (err, buffer) {
if (err) throw err;
fs.readFile(file1, function (err, data) {
if (err) throw err;
res.write(data);
res.end();
});
});
});
});
});
});
});
});
} else {
console.log(e);
}
});
我的问题是,我需要向 fs.write 和 ExternalLibrary 添加更多调用,并进一步使这些调用成为有条件的。
看起来我正在进入回调地狱。
关于回调
我知道 Meteor 使用协程(或纤维,或延续),但我不知道它是如何工作的。在 Meteor 方法中,我们可以选择使用 Meteor.wrapAsync。
我读过一些关于 Node.js Promises 和 Generators 的文章。特别是我正在试用frozeman/q-meteor 库。
问题
将这棵树“压平”并将自己从回调地狱中拯救出来的最佳方法是什么?我想要一个也允许条件方法调用的解决方案。例如,我最终需要在上面的代码示例中添加如下内容:
if (some_condition === true) {
// call this method or node function
fs.writeFile(file4, function (err) {
fs.writeFile(file5, function (err) {
// do something
}
}
}
else {
// call this method or node function
fs.writeFile(file6, function (err) {
fs.writeFile(file7, function (err) {
// do something
}
}
}