在同步和异步上遇到node.js概念

时间:2013-01-03 14:57:03

标签: node.js express

我来自PHP背景,并已开始使用node.js.我做的大多数事情还可以,但有一些事情我很难在同步与异步和范围相关时解决问题。

这是一个非常简单的例子:

app.get('/register/:invite_id?' function(req, res) {
    var agent = superagent.agent(); 
    var form = {};

    agent.post('127.0.0.1/invite/' + req.params.invite_id + '/details')
         .end(function(invite_error, invite_details) {
             form.email = invite_details.body.user.email;
             //I can console.log form.email here
         });


    // I cannot console.log form.email here.. i get undefined.
    // I need to access form.email here, so I can pre-populate my form field below...
    // Sometimes however that agent.post may take 2-3 seconds


    res.render('user/register', {
        form: form
    });

});

1 个答案:

答案 0 :(得分:1)

您必须将您的render功能调用移至帖子回调函数中的注释行:

app.get('/register/:invite_id?' function(req, res) {
    var agent = superagent.agent(); 
    var form = {};

    agent.post('127.0.0.1/invite/' + req.params.invite_id + '/details')
         .end(function(invite_error, invite_details) {
             form.email = invite_details.body.user.email;
             res.render('user/register', {
                  form: form
             });
         });
});

这样,form变量可以访问,并且可以呈现给响应流。

一般来说,我还建议您熟悉闭包的概念(简单来说,就是传递的函数,无论是作为参数还是作为返回值)。

注意:我知道一个闭包与我上面写的略有不同,但我认为对于初学者来说,这比防弹解释更容易掌握。

有关闭包的介绍,您可以从What is a 'Closure'?

开始