Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在节点中同步执行操作_Javascript_Express - Fatal编程技术网

Javascript 如何在节点中同步执行操作

Javascript 如何在节点中同步执行操作,javascript,express,Javascript,Express,我知道node是异步的,但我想在串行模式下做如下事情: 发出api请求>将正文xml转换为JSON.stringify>将字符串传递给模板 request.get({url:url, oauth:oauth}, function(err, res, body){ parseString(body, function(err, result){ output = JSON.stringify(result); res.render('home', { ti

我知道node是异步的,但我想在串行模式下做如下事情:

发出api请求>将正文xml转换为JSON.stringify>将字符串传递给模板

request.get({url:url, oauth:oauth}, function(err, res, body){
    parseString(body, function(err, result){
        output = JSON.stringify(result);

        res.render('home', { title: 'Fantasy Home', 
                output: output });
    });
});
现在我想按顺序执行,但是对于所有回调,我感到困惑

res.render无法嵌套在回调中,因为res对象不存在。把它放在外部是行不通的,因为它会在回调执行之前运行,所以输出没有定义

必须有一种按顺序做事的方法。为什么一切都是回调??为什么这些函数不能返回一个常规的非回调结果


我怎样才能做到这一点呢?

您应该使用中间件,并且承诺在节点中使用异步更好,但我将向您展示回调。强烈建议不要用同步调用阻塞线程!因为node.js是单线程的。next在这里是一个回调,所以在调用next之前,中间件不允许使用res.render执行主路由函数。你可以通过任意数量的中间产品

app.use('/user/:id', middleware, (req, res) => {
    //here you'll find your data
    console.log(req.callData);
    res.render(view, req.callData);
}
middleware(req, res, next) => {
    dotheCall(dataToPass, (err, cb) => {
        req.callData = cb;
        // remember about handling errors of course!
        return next();
    })
}

JavaScript是单线程的,如果我们使用同步代码,那么这本身就是响应时间node.js和其他方面的一个大问题。由于事件循环的好处,一切都是以回调方式实现的

您可以深入理解事件循环:非常好的解释

您可以对要实施的场景使用Promission:

获取{url:url,oauth:oauth},functionerr,res,body{ //注:这是预期功能 返回解析字符串体 .这个 .Then函数结果{ output=JSON.stringifyresult; res.render'home',{title:'fantasyhome',输出:output}; 返回true; } .catch函数错误 { //这里的错误处理代码 //然后将响应发送到客户端 };
}; 其他人没有提到为什么你的res.render不起作用。 你可能有这样的想法:

app.get('/', function(req, res, next) { // You need the res here to .render

    request.get({url:url, oauth:oauth}, function(err, res, body){ // But you are using this res instead, which does not have the render method
        parseString(body, function(err, result){
            output = JSON.stringify(result);

            res.render('home', { title: 'Fantasy Home', 
                    output: output });
        });
    });
});

阅读代码中的注释。因此,您的解决方案是,使用请求处理程序中的res.render,将request.get回调中的res重命名为其他名称。

至于原因:@tjameson很好地解释了res.render在回调中嵌套不起作用,因为res对象不存在这是完全错误的。res对象存在。如果您有错误,那么这不是出现错误的原因您的代码已经按顺序运行了。访问res可能不起作用,因为您使用request.get回调的res参数对其进行阴影处理。您理解@Bergi的注释吗?这是解决你问题的关键