gpt4 book ai didi

javascript - 将 Promise 包装在解决 Promise 的对象中有哪些缺点?

转载 作者:行者123 更新时间:2023-12-01 01:37:35 24 4
gpt4 key购买 nike

我正在开发一个在 Node 8 中构建的新微服务框架,并尝试简化在服务之间传递 Promise 所需的一些逻辑。

我在每个服务中导入了一个名为 StandardPromise 的函数,您可以将 Promise 传递给它。 StandardPromise 将在 Promise 上调用 .then() 并将结果放入一个对象中。如果 promise 得到解决,它将被放置在 data 属性中,如果被拒绝或抛出错误,那么它将被放置在 err 属性中。

上述结果是,当一个服务通过 await 调用另一个服务接收到标准化 promise 时,它可以检查 err 中是否有任何内容,并且如果 err 为空,则继续使用 data。此流程比在每个函数中使用 .then() 和 .catch() block 要简单得多。

我对它的结果非常满意,而且看起来效果很好,但由于我还没有看到很多这种流程的例子,我想知道是否有我遗漏的东西使得这个一个糟糕的想法或反模式或类似的东西。

<小时/>

这是一个简化的伪代码示例:

服务1:

const sp = require('./standardPromise');
const rp = require('request-promise-native');

function ex() {
// Wrap the Promise returned from rp as a "standardPromise"
return sp(rp.get({url: 'https://example.com'}));
}

服务2:

const Service1 = require('./Service1');

async function ex2() {
var res = await Service1.ex();
if (res.err) {
// Do error stuff
console.error(res.err);
return;
}
// Here we know res.data is our clean data
// Do whatever with res.data
return res.data;
}

标准 promise :

module.exports = function(promise) {
try {
return promise.then((data) => {
return {err: undefined, data: data};
}).catch((err) => {
return Promise.resolve({err: err, data: undefined});
});
} catch(err) {
console.error('promise_resolution_error', err);
return Promise.resolve({err: err, data: undefined});
}
}

最佳答案

It can just check if there's anything in err and move forward with data if err is empty. This flow is significantly simpler than having .then() and .catch() blocks in every function.

不,这要复杂得多,因为您始终必须检查您的错误。 Promise 的要点是每个函数中都不应该有 .catch() block ,因为大多数函数不处理错误。与旧的 Nodeback 模式相比,这是一个显着的优势。

你可以放弃你的standardPromise内容,直接写

// Service1:
const rp = require('request-promise-native');

function ex() {
return rp.get({url: 'https://example.com'});
}

// Service2:
const Service1 = require('./Service1');
async function ex2() {
try {
var data = await Service1.ex();
} catch(err) {
// Do error stuff
console.error(err);
return;
}
// Here we know data is our clean data
// Do whatever with data
return data;
}

或者实际上更简单的是 then for handling errors :

// Service2:
const Service1 = require('./Service1');
function ex2() {
return Service1.ex().then(data => {
// Here we know data is our clean data
// Do whatever with data
return data;
}, err => {
// Do error stuff
console.error(err);
});
}

关于javascript - 将 Promise 包装在解决 Promise 的对象中有哪些缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52690239/

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