[英]Node.JS Callback Scoping Issues
我正在使用JavaScript类编写用于工作的小型工具。 我不喜欢回调嵌套和嵌套,所以我喜欢将它们分解为单独的函数。 我正在尝试从for ... of循环中运行带有回调的请求。 问题是,当我将回调分为单独的函数时,它会松散for ... in循环的范围,并且它不知道“ service.url”是什么。
这是我的代码:
const DATA = require("../resources/data.json");
const Request = require("request");
class Net {
constructor(){}
_handleResponses(e, r, b) {
console.log("--------------------------------------------------------------");
if(r.statusCode == 404) {
console.log("\x1b[31m"+`[RESPONSE](Status ${r.statusCode})`, "\x1b[0m");
console.log("\x1b[31m"+`Server: ${service.server}`, "\x1b[0m");
console.log("\x1b[31m"+`Service: ${service.service}`, "\x1b[0m");
console.log("\x1b[31m"+`Body: ${b}`, "\x1b[0m");
} else {
console.log(`[RESPONSE](Status ${r.statusCode})`);
console.log(`Server: ${service.server}`);
console.log(`Service: ${service.service}`);
console.log(`Body: ${b}`);
}
}
pollServices() {
for(let service of DATA) {
Request(service.url, this._handleResponses);
}
}
}
module.exports = Net;
这是“ pollServices”功能/方法运行时出现的错误:
C:\\ Users \\ payton.juneau \\ Desktop \\ Me \\ Projects \\ Node \\ com.etouchmenu.tools.crystalBall \\ utilities \\ net.js:17 console.log(
Server: ${service.server}
); ^ReferenceError:未在Request._handleResponses(作为_callback)处定义服务(C:\\ Users \\ payton.juneau \\ Desktop \\ Me \\ Projects \\ Node \\ com.etouchmenu.tools.crystalBall \\ utilities \\ net.js:17:36)在Request.emit(事件:C:\\ Users \\ payton.juneau \\ Desktop \\ Me \\ Projects \\ Node \\ com.etouchmenu.tools.crystalBall \\ node_modules \\ request \\ request.js:186:22) .js:159:13)。 (C:\\ Users \\ payton.juneau \\ Desktop \\ Me \\ Projects \\ Node \\ com.etouchmenu.tools.crystalBall \\ node_modules \\ request \\ request.js:1163:10)在Request.emit(events.js:159:13) )在IncomingMessage。 (C:\\ Users \\ payton.juneau \\ Desktop \\ Me \\ Projects \\ Node \\ com.etouchmenu.tools.crystalBall \\ node_modules \\ request \\ request.js:1085:12)在Object.onceWrapper(events.js:254:19) )在process._tickCallback(内部/process/next_tick.js:152:19)在endReadableNT(_stream_visible.js:1062:12)在IncomingMessage.emit(events.js:164:20)
任何帮助将不胜感激,这对所有这类东西都是新的。
当您在一个类上定义2个方法时,它们各自创建自己的独立范围:
class Example {
method1() {
// scope of method 1 only visible to method 1
let hiddenInM1 = 'example'; // <-- only available here
}
method2() {
// scope of method 2 only visible to method 2
// I don't know what m1 is
}
}
这些方法有3种相互共享值的方式。
1.使用外部作用域中可用的变量,这两种方法都属于以下两种方法:
let sharedGlobal = 'example';
class Example {
method1() {
// I can see sharedGlobal
}
method2() {
// I also can see sharedGlobal
}
}
这通常是不明智的做法,因为全局状态容易出错 。
2.通过类的上下文,这些方法属于(通过this
)
class Example {
constructor() {
this.sharedClassVar = 'example'
}
method1() {
// I can see this.sharedClassVar
}
method2() {
// I also can see this.sharedClassVar
}
}
3.通过互相传递参数。
class Example {
method1(fromMethod2) {
// I can receive stuff from method2
}
method2() {
this.method1('example')
}
}
如果你看一下你的代码,没有这些模式都存在,因此_handleResponses
没有访问service
定义pollServices
。
您可以做的最简单的更改就是自己通过service
:
_handleResponses(service, e, r, b) {
// ^^^^^^^ receive the service here
}
pollServices() {
for (let service of DATA) {
Request(service.url, (...args) => this._handleResponses(service, ...args))
// ^^^^^^^ pass the service with the args
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.