Meteor 1.* と Iron Router 1.* を使用しています。
Meteor のサーバー側、Meteor メソッドの外側、特にサーバー側の Iron Router ルート内で Node.js 呼び出しを使用しています。
これまでのところ、ルート内のコードの一部は次のようになります。
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 and 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
}
}
}