Интересно, как я могу передать свойство класса в функцию, расположенную в каждом из методов, как показано ниже. Я обнаружил, что могу вызвать свойство из вновь созданного экземпляра, но это означает, что класс не может быть реплицирован. Есть ли удобный способ наследования объектов для вызова свойства класса изнутри функции, расположенной в function> .each> method> class?
class ok {
constructor() {
this.jojo = "first state";
}
myMethod() {
let rp = require('request-promise-native');
let cheerio = require('cheerio');
rp("https://tomydna.com")
.then(response => {
let $ = cheerio.load(response);
$('a').each(function() {
this.jojo = "second state"; // This does not work
ok1.jojo = "second state from outside"; // This would work but it is not good because it is related to one instance only. If a new Instance is created the method stops working.
console.info(ok1.jojo); // will replicate as many times it finds url on the page.
});
});
}
}
ok1 = new ok();
ok1.myMethod();



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете присвоить объект this другой переменной. Вы не можете использовать объект класса okthis в функции .each, потому что внутри .each он представляет текущий непосредственный объект (обратный вызов функции .each), следующий пример может вам помочь
class ok {
constructor() {
this.jojo = "first state";
}
myMethod() {
let self = this;
let rp = require('request-promise-native');
let cheerio = require('cheerio');
rp("https://tomydna.com")
.then(response => {
let $ = cheerio.load(response);
$('a').each(function () {
self.jojo = "second state"; // This will work
ok1.jojo = "second state from outside"; // This would work but it is not good because it is related to one instance only. If a new Instance is created the method stops working.
console.info(ok1.jojo); // will replicate as many times it finds url on the page.
});
});
}
}
ok1 = new ok();
ok1.myMethod();
спасибо @ adz5A, обновленный код
В обратном вызове .each вы можете использовать стрелочную функцию. Однако убедитесь, что если вы хотите иметь ссылку на узел cheerio dom, ваш обратный вызов имеет форму (index, node) => {/* your code */}.
это просто проблема объема. Назначьте this локальной переменной, а затем используйте ее внутри каждого. например:
myMethod() {
let that = this; //local variable
let rp = require('request-promise-native');
let cheerio = require('cheerio');
rp("https://tomydna.com")
.then(response => {
let $ = cheerio.load(response);
$('a').each(function() {
that.jojo = "second state"; // usage
console.info(that.jojo);
});
});
}
Вы не можете объявить переменную в теле класса ...