在Meteor中pipe理asynchronouscallback

我正在使用Meteor 1. *和Iron Router 1. *。

我使用的是Meteor方法之外的Meteor服务器端的Node.js调用 – 特别是在服务器端的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的调用,并进一步使这些调用的条件。

看起来我正在进入回拨地狱。

在callback

我知道Meteor使用协程(或者纤维,或者延续),但是我不知道这是如何工作的。 而在meteor法中,我们可以select使用Meteor.wrapAsync。

我已经阅读了一些关于Node.js Promise和Generators的内容。 具体来说,我正在尝试frozeman / q-meteor库。

什么是“扁平化”这棵树并从callback地狱救自己最好的方法? 我想要一个解决scheme,也将允许条件方法调用。 例如,我将最终需要在上面的代码示例中添加如下内容:

 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 } } } 

我最终使用Promise解决scheme。 我使用了Kris kriskowal / q的优秀Q库。 具体来说,这个meteor包装是frozeman / q-meteor。

以下是代码:

 makeDirectory(filebox) .then(function () { console.log('in write file function'); return writeFile(file1, data); }) .then(function () { console.log('in write file function'); return writeFile(file2, data); }) .then(function () { console.log('in write file function'); return writeFile(file3, data); }) .then(function () { console.log('in external lib function'); return ExternalLibrary._do_something(file1, data1, output1); }) .then(function () { console.log('in external lib function'); return ExternalLibrary._do_something(file2, data2, output2); }) .then(function () { console.log('in external lib function'); return ExternalLibrary._do_something(file3, data3, output3); }) .then(function () { console.log('in concat function'); return ExternalLibrary.cat(fileToCat, outputCat); }) .then(function () { console.log('in read file function'); return readFile(outputCat); }) .then(function (result) { console.log('in the response function'); res.write(result); res.end(); }) .catch(function (error) { console.log('darn error: ', error); }) .done(function (result) { console.log('done'); }); 

外部函数库和函数调用,然后返回一个延迟的承诺,其输出可以在前面的函数调用中使用。

一些帮助我开始的链接:

  • 承诺者的承诺指南

  • 用Q.在Node.js中承诺

  • kriskowal / q API参考

  • 承诺反模式