2015-08-20 2 views
0

Я работаю, чтобы реорганизовать некоторые Node.js код, который использует Seq, и из документации и this answer, я понимаю, что я использую this(), чтобы перейти к следующему .seq(), но как я могу передать переменную к следующему .seq() ' s функция?Как передать переменную в следующий .seq с помощью 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 

[...] 

Но что, вместо этого, приводит к ошибке (я не был в состоянии отследить, какая-то ошибка все же, хотя, потому что это как-то отправляется в функцию ErrorHandler, что похоже, скрывает ошибку). Как я должен это делать?

+0

Учитывая, что 'this' кажется nodeback, попробуйте' это (нуль, данные) '. Но если 'saveData' не является асинхронным вообще, нет причин поместить' res.json (data) 'в свой собственный обратный вызов. – Bergi

+0

Это сработало! Не решила мою проблему напрямую, но она привела к цепочке, которая ее исправила. :) Если вы положите это как ответ, я был бы рад принять его. –

+0

done ... Обратите внимание, что если вы нашли решение самостоятельно, вы можете [отправить ответ самостоятельно] (http://stackoverflow.com/help/self-answer); особенно если это более полно – Bergi

ответ

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); 
Смежные вопросы