我正在使用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的调用,并进一步使这些调用成为条件。
看起来我正在进入Callback地狱。
我知道Meteor使用了Coroutines(或光纤或延续版),但我不知道它是如何工作的。在Meteor方法中,我们可以选择使用Meteor.wrapAsync。
我已经阅读过Node.js Promises和Generators上的一些内容。特别是我正在试用frozeman / q-meteor库。
什么是最好的方式来平息'这棵树从Callback地狱中拯救自己?我想要一个允许条件方法调用的解决方案。例如,我最终需要在上面的代码示例中添加如下内容:
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
}
}
}
答案 0 :(得分:0)
我最终使用Promises来解决问题。我使用了Kris kriskowal / q的优秀Q库。特别是这个流星包装器是冻结/ q流星。
以下是代码:
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');
});
每个外部库和函数调用。然后返回一个延迟的promise,其输出可以在前面的.then函数调用中使用。
一些帮助我入门的链接: