我正在努力重构一些使用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
但是,相反,它会导致错误(我还没有能够追踪到什么样的错误,因为它以某种方式被发送到似乎隐藏错误的错误处理程序函数)。我该怎么办呢?
答案 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);