如何使用Seq将变量传递给下一个.seq?

时间:2015-08-20 18:49:01

标签: javascript node.js asynchronous

我正在努力重构一些使用Seq的Node.js代码,并且从文档和this answer开始,我得到this()继续使用.seq() { {1}},但如何将变量传递给下一个.seq()的函数?

这是我到目前为止所尝试的内容:

$()
.seq(function() {
    User.findById(req.user._id, this);
})
.seq(function(user) {

    if (!user) { return res.json(400, {'user': 'User not found.'} ); }

    var data = req.body;

    saveData(data, user, true);

    this();

})
.seq(function(data) {

    return res.json(data);

})
.catch(next);

第一个.seq()在没有this()次调用的情况下直接移动,但第二个.seq()将不会移动到下一个this(),除非我调用.seq。但是,在到达最后一个data时,undefined现在是[...] saveData(data, user, true); this(data); //Added "data" here [...] 。因此,我试过这个:

from concurrent.futures import ThreadPoolExecutor

class Handler(tornado.web.RequestHandler):

    def initialize(self, param):
        self.db = param

    @gen.coroutine
    def post(self):
        self.set_status(200)
        with ThreadPoolExecutor(1) as execute:
            r = yield execute.submit(self.handleSearch, param=request.arguments)
            self.finish(r)

    def handleSearch(self, param):
        try:
            return self.db.createList(param) # or time.sleep(4) (sth which block)
        except Exception as e:
            return False

但是,相反,它会导致错误(我还没有能够追踪到什么样的错误,因为它以某种方式被发送到似乎隐藏错误的错误处理程序函数)。我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

由于该回调不是异步的,因此没有理由将其置于自己的seq调用中。只是做

…
.seq(function(user) {
    if (!user) 
        return res.json(400, {'user': 'User not found.'} );
    var data = req.body;
    saveData(data, user, true);
    return res.json(data);
})

否则,如果您确实需要传递数据,this确实遵循节点回调约定 - 第一个参数指定错误,第二个参数指定结果值。所以你必须先通过null

…
this(null, data);