gpt4 book ai didi

javascript - 管理 Meteor 中的异步回调

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:07 25 4
gpt4 key购买 nike

我正在使用 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 的调用,并进一步使这些调用成为有条件的。

看起来我正在进入回调 hell 。

回调

我知道 Meteor 使用协程(或纤维,或延续),但我不知道它是如何工作的。在 Meteor 方法中,我们可以选择使用 Meteor.wrapAsync。

我读过一些关于 Node.js Promises 和 Generators 的文章。具体来说,我正在尝试 frozeman/q-meteor 库。

问题

“压平”这棵树并将自己从回调 hell 中拯救出来的最佳方法是什么?我想要一个也允许条件方法调用的解决方案。例如,我最终需要在上面的代码示例中添加如下内容:

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 来解决这个问题。我使用了 Kris kriskowal/q 的优秀 Q 库。具体来说,Meteor 包装器是 freezeman/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');
});

每个 .then 中的外部库和函数调用都返回一个延迟的 Promise,其输出可以在前面的 .then 函数调用中使用。

一些帮助我入门的链接:

关于javascript - 管理 Meteor 中的异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com