7

我将 NodeJS 与 Express 一起使用,并使用 Bluebird 进行承诺。我正在尝试如下承诺 app 对象,但一旦承诺的函数总是抛出错误。部分代码如下:

var express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    Promise = require("bluebird");

    app.postAsync = Promise.promisify(app.post);

    app.postAsync('/api/v1/users/update').then(function(req, res, next) {
    // never gets here
    })
        .catch(function(err) {
            console.log("doh!!!"); 
        });

我试图 promisifyAll 具有相同的效果。为什么它失败了,有什么方法可以承诺发布/获取?

4

1 回答 1

19

你真的真的不想这样做。承诺是错误的抽象。

承诺代表一个最终操作的结果。一个promise只能改变它的状态一次,所以即使你设法app.post正确地promisify,它也只能服务一个客户,一次。

Promise 是一个很棒的抽象——但这绝对不是 Promise 旨在解决的问题。相反,如果您对带有Promise 的有趣抽象感兴趣,您可以查看 kriskowal(Q 作者)的 Q-IO 或您返回 Promise 以响应但处理程序本身被多次调用的 Promise 路由器之一。

这一点我怎么强调都不过分——promise 是一个很棒的抽象,但它们并没有解决或试图解决你所有的并发问题。

于 2014-07-17T08:17:09.117 回答