【问题标题】:nodejs promise then with only one paramter opposed to 2节点 js 承诺然后只有一个参数而不是 2
【发布时间】:2016-08-09 03:21:41
【问题描述】:

这是从运行 express 的 nodejs 应用程序调用路由文件中的控制器,并使用基于 promise 的 api。

router.post('/create-user', function(req, res) {
        CreateUserController.createUser( req.body.username, req.body.username ).then( res.jsonSuccess, res.jsonFail );
});

如您所见,上述解析回调的最终结果命中 res.jsonSuccess,而拒绝(then 函数中的第二个参数)命中 res.jsonFail。

res.jsonSuccess 和 res.jsonFail 是该项目的自定义中间件,只需相应地格式化和记录数据。

我的问题:我想进一步简化。是否可以将一个参数传递给可以处理解析和拒绝的then()

例如

router.post('/create-user', function(req, res) {
        CreateUserController.createUser( req.body.username, req.body.username ).then( res.jsonOutDecide );
});

根据接受的答案,我能够将以下中间件放在一起:

    /**
 * unify the json output of any response with jsonFail and jsonSuccess methods
 */
module.exports = function(){
    return function(req, res, next) {

        /**
         * Error json output
         * @param errObj (optional)
         * @returns {*}
         */
        res.jsonFail = function ( errObj ) {
            errObj = errObj || {};
            return res.json({
                success : false,
                error   : errObj
            })
        };

        /**
         * Success json output
         * @param data
         * @returns {*}
         */
        res.jsonSuccess = function ( data ) {
            data = data || {};
            return res.json({
                success: true,
                data: data
            });
        };

        /**
         * Accepts a promise and passes onto the success or fail options above
         * @param p
         * @returns {*}
         */
        res.jsonPromise = function(p) {
            return p.then(res.jsonSuccess, res.jsonFail);
        };

        next();
    };
};

现在可以很容易地在使用基于 prmoise 的控制器的路由文件中使用,例如:

router.get('/get-all', function(req, res) {
    res.jsonPromise( CreateUserController.getAllUsers( ) );
});

【问题讨论】:

  • 这并没有真正简化事情,也不是你想要的,但你可以做then(res.jsonGood).catch(res.jsonBad)
  • 它可能会......我想知道是否有更高的配置允许所有未被第二个参数函数捕获的承诺成为一个函数。这样路由器只需要关心自己是否成功,路由器级别的失败将被捕获网捕获
  • @adam-beck 但是that's not the same thing
  • @Bergi 不知道这一点。感谢分享!

标签: javascript node.js promise


【解决方案1】:

是否可以将一个参数传递给then() 来处理解析和拒绝?

没有。

您想要做的是定义一个可以将承诺传递给的函数:

function jsonPromise(res, p) {
    return p.then(res.jsonSuccess, res.jsonFail);
}

这样你就可以了

router.post('/create-user', function(req, res) {
    jsonPromise( res, CreateUserController.createUser( req.body.username, req.body.username ) );
});

更复杂的方法是获取整个 promise-returning 函数并装饰它:

function jsonResponse(f) {
    return function(req, res) {
        Promise.resolve(req).then(f).then(res.jsonSuccess, res.jsonFail);
        // similar to `f(req).…`, but catching exceptions and allowing plain return values
    };
}

router.post('/create-user', jsonResponse(function(req) {
    return CreateUserController.createUser( req.body.username, req.body.username );
}));

【讨论】:

  • 哦,太好了!非常感谢您。很好的想法
  • 这很好,但我认为你冒着难以阅读代码的风险。这显然是固执己见,但作为从事此工作的人,我必须了解 json 函数的工作原理。
  • 是的,我实际上更喜欢这里的第一步。但是不要将其放置在如上图所示的路由器中,而是将其放置在中间件中,该中间件依次调用 jsonSuccess 或失败中间件
  • @adam-beck: 可能比必须了解res.jsonSuccessres.jsonFail 函数的工作原理更好:-) 我不太精通express.js,也许它会将jsonPromise 函数定义为res 的方法更为惯用。
  • 我或多或少地试图说明,“仅仅因为你可以并不意味着你应该”。您仍然需要知道这两个功能是如何工作的,但现在它们对您“隐藏”了。我不是在贬低你的代码或答案,只是在可能不需要的地方给我 2 美分 :)
【解决方案2】:

不,您不能拥有一个同时处理resolvereject 的函数。原因是如果createUser() 函数中出现错误,代码执行将首先查找将处理错误的位置。也就是说,在 .then().catch() 的第二个参数中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2017-07-23
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多