首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在解决承诺的对象中包装承诺的缺点是什么?

在解决承诺的对象中包装承诺的缺点是什么?
EN

Stack Overflow用户
提问于 2018-10-07 23:51:17
回答 1查看 56关注 0票数 0

我正在开发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});
    }
}
EN

回答 1

Stack Overflow用户

发布于 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);
    });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52690239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档