gpt4 book ai didi

javascript - 基本范围问题(javascript 和 Node)

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:17 25 4
gpt4 key购买 nike

嗨,我有一个非常简单的(我认为)js 问题,我似乎被困住了。我正在尝试创建下面的路线。

从 bEtsy 函数中获取 console.logged 的​​内容是我希望在页面上显示的内容。但是“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) 运行后很长时间被调用。

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

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

});


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

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

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 中没有办法知道回调函数是否是异步的。通常是这样,但如果它是同步的并且您期望异步,您也可能会遇到麻烦!所以我认为最好将其写为注释(在整个项目中始终是完全相同的短字符串),即正式的代码注释。顺便说一句,这会导致另一个问题:当您编写接受回调函数的函数时,请确保它们始终以同步或异步方式调用它,而不是同时以两种方式调用(某些函数使用缓存值并且能够立即返回结果,而不是启动异步网络请求)。

基本上,这种风格的书面结构不会反射(reflect)运行时情况 - 但这没关系,因为运行时情况无论如何都是完全灵活的(如果您想更改您使用的回调函数,或者在中间添加另一个回调函数,您真的想移动大量代码行而不只是交换名称吗?更不用说提高可重用性的易用性)。恕我直言,在更长的回调式代码文件中,这比多层深层嵌套异步函数更容易阅读。除了模块模式之外,尽可能避免函数内部的函数。

命名函数也更有利于调试,堆栈跟踪也更容易阅读。

注意:我的示例代码留下了一个悬而未决的问题:如果这是在模块(或类)内部,那么这些将是内部函数,并且您可能必须确保正确的上下文/范围(如果您从这些函数内部以这种方式访问​​对象成员变量,则 this 指向的位置)。不过,当这些功能位于原型(prototype)上时,它的工作原理是相同的。所以这只是一个一般概念示例,忽略了这个附带问题。

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

关于javascript - 基本范围问题(javascript 和 Node),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com