соглашаться в this в callback ecma6

Друзья, у меня есть следующий код:

Объект Выбор (в методе получать находится значимый код):

class Seleccion extends React.Component{

constructor(){
    super();
    this.state ={
        image : null,
        selecciones:[]
    }
    this.obtener();
}

obtener(){
    var seleccion = this;
    API.consulta({
        metodo: 'listas/selecciones',
        'callback': function (r) {
            console.log("can we proccess?",r);
            let selecciones = [];
            selecciones.push = r.selecciones;
            seleccion.setState({
                selecciones:r.selecciones
            })
            console.log("cambiado 2",seleccion.state);


        }
    });
}
//más codigo de la clase seleccion

}

API.js

 consulta: function (data) {
        console.log("llamada desde API");
        let parametros = this.default;
        console.log("binding this?",data);
        let url = this.obtUrl(data.metodo);

        if (!data.hasOwnProperty('metodo'))  throw Error('No se ha pasado el metodo a consultar');
        if (!data.hasOwnProperty('callback'))  throw Error('No se ha pasado la funcion callback');

        parametros = Object.assign({},this.default,{
            dataType: 'jsonp',
            url: url
        })

        console.log("url",parametros.url);
        if (data.hasOwnProperty('parametros')) parametros = $.extend(this.default, data.parametros);

        if (data.hasOwnProperty('data'))
            parametros.data = data.data;

        $.ajax(parametros)
            .done(data.callback)
            .fail(function(){
                console.log("something wrong");
            })
        ;
    },

В этих моментах, я нуждаюсь в том, чтобы согласиться в функции callback на объект "выбор", чтобы реализовывать изменения в состояние, согласно ответу. Но если я перемещаю один ".bind (this)" в метод, консультация эксплуатирует меня. как я могу делать?.

Тема состоит в том, что с консультацией ajax я получаю дату "выбора" и согласно результату, я буду должен изменять состояние той же самой для renderizarlos, именно из-за этого нуждался с функции callback в том, чтобы согласиться на объект Выбор. PD: я знаю, что sobreescribiendo переменная или называя ее он мог бы соглашаться, но понимаю, что с ecma6 есть новая форма. это так? спасибо.

1
задан 22.01.2017, 22:15
0 ответов

Если то, что ты хочешь, состоит в том, чтобы менять контекст this в твоем callback с ES5, было бы достаточно создавать копию этого с помощью bind следующего способа (например):

.done(data.callback.bind(data)) 

Сходя за параметр в bind стоимость this который ты хочешь использовать.

В случае ES6 ты мог бы решать это с осуществлением arrow functions () => { }. Обрати внимание в methodA класса A следующего примера:

var API = {
  query: data => {
    // Algo asincrono como un ajax iria aqui...
    // Simulemos con setTimeout:
    setTimeout(data.callback, 1000);
  }
};

class A {
  constructor() { this.state = false }
  
  methodA() {
    API.query({
      callback: () => {
        this.state = true;
        console.log(Object.keys(this));
      }
    });
  }
  
  methodB() {
    API.query({
      callback: function() {
        console.log(Object.keys(this));
      }
    });
  }
}

const a = new A();
a.methodA(); // Propiedades de la clase A (objeto 'a')
a.methodB(); // Objeto window
0
ответ дан 03.12.2019, 17:34
  • 1
    Allí actualicé có я говорю, спасибо за ответ. В этих моментах, así я функционирует, однако, консоль я está давая warning, которого я соглашаюсь некорректно на объект. Если ты обращаешь внимание, что я сделал, состояло в том, чтобы называть переменную и он соглашаться с новым именем в funció n callback. идея состояла в том, чтобы понимать, как возможно делать это правильно как ecmascript6 –  22.01.2017, 22:19
  • 2
    Большое спасибо. Совершенный –  23.01.2017, 13:12