Вызовите метод setTimeOut для JavaScript в классе dojo - PullRequest
5 голосов
/ 23 февраля 2011

Я пытаюсь преобразовать свои функции JavaScript в класс dojo. У меня setTimeOut("functionName",2000) в одном из моих методов JS. Как я вызываю это из метода в классе, исключенном с помощью метода dojo.declare. Например, ниже мой пользовательский класс.

    dojo.declare("Person",null,{
                    constructor:function(age,country,name,state){
                        this.age=age;
                        this.country=country;
                        this.name=name;
                        this.state=state;
                    },
                    moveToNewState:function(newState){
                        this.state=newState;
//I need to call "isStateChanged" method after 2000 ms. How do I do this?
                        setTimeOut("isStateChanged",2000);
                    },                  
                    isStateChanged:function(){
                        alert('state is updated');
                    }
                });
var person=new Person(12,"US","Test","TestState");
person.moveToNewState("NewState");

Пожалуйста, дайте мне знать, как я могу вызвать метод isStateChanged из метода moveToNewState после 2000 мс.

Ответы [ 4 ]

9 голосов
/ 23 февраля 2011

То, что вы ищете, это способ привязки значения this к функции, которую вызовет setTimeout:

moveToNewState:function(newState){
    // Remember `this` in a variable within this function call
    var context = this;

    // Misc logic
    this.state = newState;

    // Set up the callback
    setTimeout(function() {
        // Call it
        context.isStateChanged();
    }, 2000);
},     

Выше используется замыкание для привязки контекста (см .: Замыкания не сложны ), что является обычным способом сделать это.Dojo может предложить встроенную функцию для генерации этих «связанных» обратных вызовов (Prototype и jQuery do).( Редактировать: В своем комментарии ниже peller любезно указал dojo.hitch.)

Подробнее об этой общей концепции здесь: Вы должны помнить this

2 голосов
/ 13 марта 2011

Вы можете просто вызвать setTimeout(this.isStateChanged, 2000), который передаст правильную ссылку на функцию, почти так же, как вы вызываете метод напрямую. Выражение this.isStateChanged вычисляется немедленно. Чтобы сделать вызов, нет необходимости заключать его в дополнительную функцию или объявлять локальные переменные.

Чтобы связать переменную this с вызываемой функцией, вы можете использовать dojo.hitch , которая создаст свое собственное замыкание, не загрязняя пространство локальной переменной и потенциально просачиваясь через другие ссылки.

2 голосов
/ 23 февраля 2011

Это не имеет ничего общего с додзё, это чистый javascript. То, что вы ищете:

var $this = this;
setTimeout(function() { $this.isStateChanged() }, 2000);

Проверьте документы по setTimeout .

О, и, пожалуйста, не используйте кавычки вокруг имен ваших функций (потому что это делает бесполезную строку, которая, вероятно, получит eval ed и выдаст ошибку).

1 голос
/ 17 марта 2017

Вы можете использовать dojo / _base / lang и использовать метод его заминки, как показано ниже:

moveToNewState:function(newState){
  // Misc logic
  this.state = newState;

  // Set up the callback
  setTimeout(lang.hitch(this, function() {
    // Call with `this`
    this.isStateChanged();
  }), 2000);
}, 
...