繁体   English   中英

Node.JS回调作用域问题

[英]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.

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