我正在开发Node 8中构建的微服务的新框架,并试图简化在服务之间传递承诺所需的一些逻辑。
我在每个服务中都导入了一个名为StandardPromise的函数,您可以向它传递一个承诺。StandardPromise将对promise调用.then()
,并将结果放入一个对象中。如果promise被解决,它将被放在data
属性中,如果被拒绝或抛出错误,那么它将被放在err
属性中。
上面的结果是,当一个服务通过await
对另一个服务的调用接收到标准化的promise时,它可以只检查err
中是否有任何东西,如果err
为空,则继续使用data
。与在每个函数中使用.then()和.catch()块相比,此流程要简单得多。
我对它的结果相当满意,而且它似乎工作得很好,但由于我还没有看到很多这种流的例子,我想知道我是否遗漏了一些东西,使它成为一个糟糕的想法或反模式或类似的东西。
下面是一个简化的、有点伪代码的示例:
Service1:
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'}));
}
Service2:
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;
}
standardPromise:
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});
}
}
发布于 2018-10-08 01:25:27
它可以检查
err
中是否有任何内容,如果err
为空,则继续使用data
。与在每个函数中都包含.then()
和.catch()
块相比,此流程要简单得多。
不,这要复杂得多,因为你总是要检查你的err
。promises的要点是不在每个函数中都有.catch()
块,因为大多数函数都不处理错误。与旧的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);
});
}
https://stackoverflow.com/questions/52690239
复制相似问题