繁体   English   中英

基本范围问题(javascript和节点)

[英]Basic scope issue (javascript and node)

嗨,我有一个非常简单的(我认为)js问题,我似乎一直坚持。 我正在尝试创建以下路线。

从bEtsy函数中获取console.logging的是我希望在页面上显示的内容。 但是“ body”在该范围之外不可用。

app.get('/api/etsy/getListings',function(req, res){

    bEtsy.getAllListings(req, res, function(err, body) {
      // console.log(body);
    });

    res.json(req.body);   // both this and res.json(body) does not work

});

移动res.json(req.body); 进入回调函数。

除了范围界定问题之外:它是异步的,因此在您的代码中,它将在res.json(req.body)运行很长时间后被res.json(req.body)

app.get('/api/etsy/getListings', function(req, res) {

    bEtsy.getAllListings(req, res, function(err, body) {
      res.json(body);
      //console.log(body);
    });

});


除了手头的问题外,还有更一般的建议(或两三个):

在这种情况和“回调思考”中,对我有帮助的是,几乎永远不要使用内联回调函数:仅编写一层深的代码(当然,还要为模块模式加一层),避免回调地狱! 为所有回调命名,并将它们全部写在同一(最高)级别上。

function allListingsReceived(err, body, res) {
    res.json(body);
    //console.log(body);
}

function getListings(req, res) {
    // ASYNC
    bEtsy.getAllListings(req, res, allListingsReceived);
}

//ASYNC
app.get('/api/etsy/getListings', getListings);

这使我可以更好地了解实际的呼叫顺序。 在这种情况下,当getAllListings时,您就知道它是异步的-在我自己的代码中,我添加了明确的注释(就像我上面所做的一样)。 因此,我知道在该异步功能之后我要写的任何内容都将无法访问应该由异步功能获取的任何内容。 恕我直言,这样的注释很重要 -在Javascript中,没有办法知道回调函数是否异步。 通常是这样,但是如果它是同步的并且您期望异步,那么您也可能会遇到麻烦! 因此,我认为最好将其写为注释(在整个项目中始终使用相同的短字符串),形式化的代码注释。 顺便说一句,这会导致另一个问题:编写接受回调函数的函数时,请确保它们始终以同步或异步方式调用它,而不是两种方式都使用(某些函数使用缓存的值并且能够立即返回结果,而不是返回结果发起异步网络请求)。

基本上,书面结构不能用这种样式反映运行时的情况-但这没关系,因为无论如何运行时的情况都是完全灵活的( 如果您想更改使用的回调函数,或者在两者之间添加另一个回调函数,您真的想要转移成千上万行代码,而不是仅仅交换一个名称?更不用说提高可重用性 在较长的回调样式代码文件中,这比多层嵌套的异步函数恕我直言要容易得多。 除了模块模式,请尽可能避免使用函数内部的函数。

具有命名函数对于调试也要好得多,堆栈跟踪更易于阅读。

注意事项:我的示例代码留下一个问题开:如果这是一个模块(或类)内,这些将是内部的功能,你可能必须确保对正确的上下文/范围(其中this指向,如果你访问对象成员变量以这种方式从那些函数内部)。 当这些功能在原型上时,它的工作原理相同。 因此,这只是一个无视此附带问题的一般概念示例。

另一个注意事项:在编写此样式变量时,以前必须通过闭包对内部函数可用(在本示例中为res ,现在必须在调用回调函数时将其用作函数参数。 这增加了一些复杂性-但另一方面迫使您在自己的代码中创建更干净的API。 我个人不喜欢过分依赖闭包来传递参数。 我太傻了,我更喜欢通过在函数头中使用函数的所有参数来获得干净的接口定义。 显然,我并不孤单,这是最经常被吹捧为函数式编程的优点之一:)填充有观点认为是“干净”也都是在对象属性的头一个替代this 我的小例子看起来有点“程序性”,但仅用于说明一个要点。 当然,这属于模块化编程的更大范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM