gpt4 book ai didi

javascript - 使用 Node 异步函数避免 Promise 反模式

转载 作者:搜寻专家 更新时间:2023-11-01 00:01:07 25 4
gpt4 key购买 nike

我已经意识到 Promise 反模式,担心我可能会在这里上当(请参阅函数内的代码摘录)。可以看出,我将 Promises 嵌套在两个 Node 异步函数中。我能够公开内部 Promise 的唯一方法是使用外部 Promise。我欢迎有关如何更优雅地编写它的指导。

function xyz() {
return new Promise(function(resolve, reject) {
return Resto.find({recommendation: {$gte: 0}}, function (err, data) {
if (err) return reject("makeSitemap: Error reading database");

return fs.readFile(__dirname + '/../../views/sitemap.jade', function(err, file) {
if (err) return reject("makeSitemap: Error reading sitemap template");

[snip]

resolve(Promise.all([
NLPromise('../m/sitemap.xml', map1),
NLPromise('../m/sitemap2.xml', map2)
]));
});
});
});
}

我也在这个 plnkr 中发现了这个问题

最佳答案

最好的解决方案是创建回调函数的 promise 版本。 bluebird ,一个出色的 promise 实现(比 Node 的原生实现更好),内置了这个。

Bluebird.promisifyAll(Resto); // If you can promisify the prototype, that’s better
Bluebird.promisifyAll(fs);

function xyz() {
return Resto.findAsync({recommendation: {$gte: 0}}).then(function (data) {
return fs.readFileAsync(__dirname + '/../../views/sitemap.jade').then(function (file) {


return Bluebird.all([
NLPromise('../m/sitemap.xml', map1),
NLPromise('../m/sitemap2.xml', map2)
]);
});
});
}

此外,如果 fs.readFile 不依赖于 Resto.findAsync,您应该同时运行它们:

return Bluebird.all([
Resto.findAsync({recommendation: {$gte: 0}}),
fs.readFileAsync(__dirname + '/../../views/sitemap.jade'),
]).spread(function (data, file) {


return Bluebird.all([
NLPromise('../m/sitemap.xml', map1),
NLPromise('../m/sitemap2.xml', map2),
]);
});

关于javascript - 使用 Node 异步函数避免 Promise 反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32038961/

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