0

以前は持っていた

 MyClass.prototype.method1 = function(data1) {
    return this.data111.push(data1);
  };

 MyClass.prototype.method2 = function(i) {
    var data = this.method1(i);
    if (data.condition1 != null) {
      data.onEvent1(this);
    }
    return $(data.element).someMethod123("data123");
  };

 MyClass.prototype.method3 = function() {
    var data1 = this.method1(this._data1);
    return this.someMethod123(step.data1);
  };

MyClass.prototype.ended = function() {
    return !!this.getState("end");
  };


MyClass.prototype.getState = function(key) {
    var value = $.cookie(key);
    this._options.afterGetState(key, value);
    return value;
  };

コールバック関数を使用して非同期にするにはどうすればよいですか? 私はそれがそうあるべきだと思います:

 MyClass.prototype.method1 = function(data1, callback) {
    if(callback){
      callback(this.data111.push(data1));
    }
    else{
      return this.data111.push(data1);
   }
  };

 MyClass.prototype.method2 = function(i, callback) {

    var data = this.method1(i);
    if (data.condition1 != null) {
      data.onEvent1(this);
    }
    if(callback){
      callback($(data.element).someMethod123("data123"));
    }
    else{
     return $(data.element).someMethod123("data123");
    }
  };

 MyClass.prototype.method3 = function(callback) {
    var data1 = this.method1(this._data1);
     if(callback){
      callback(this.someMethod123(step.data1));
    }
    else{
       return this.someMethod123(step.data1);
    }
  };

MyClass.prototype.ended = function(callback) {
    if(callback){
       callback(!!this.getState("end", /*what should be here and what should it does?*/));
    }
  };


  MyClass.prototype.getState = function(key, callback) { 
    var oldThis = this;
    setTimeout(function(){ 
                    value = $.cookie(key);
                    callback(value, oldThis); 
                    oldThis._options.afterGetState(key, value);
                  },
              0);
  };

以前はJavaScriptで非同期関数を使用したことがなかったので、間違いなく何かを見逃していました。それでそれ?

そして、私が理解したように、関数を非同期にするには、基本的にもう 1 つのパラメーターをコールバック関数として追加し、return を取り除く必要がありますね。

4

2 に答える 2

1

非同期タスクを実行するメソッドのみがコールバックスタイルを必要とします。、、に使用する理由はありmethod1ませmethod2method3

getStateこれが実際の非同期メソッドです。ここでは、ajax /setTimeout/何でも使用することが非常に明白です。それでも、1つの間違いを見つけることができます。ステートメントcallbackの後に何もしないのと同じように、呼び出しは常に最後のステートメントである必要がありますreturn。可能であっても、内部オプションオブジェクトを設定したでコールバックすることをお勧めします。

                …
                oldThis._options.afterGetState(key, value);
                callback(value, oldThis);

さて、endedメソッド。asyncを使用するためgetState、それ自体が非同期になり、コールバックスタイルを使用する必要があります(getState()値を返さないことに注意してください)。したがって、を呼び出しgetState、それがコールバックされると、結果を変換して独自のコールバックに渡します。

MyClass.prototype.ended = function(callback) {
    this.getState("end", function ownCallback(state) {
        var result = !!state; // or whatever you need to do
        callback(result);
    });
};
// and if you don't need to do anything with the result, you can leave out ownCallback:
MyClass.prototype.ended = function(callback) {
    this.getState("end", callback);
};
于 2013-01-29T15:49:34.980 に答える
1

コールバックを渡すだけです:

MyClass.prototype.ended = function(callback) {
    this.getState("end", callback);
};

他の関数でもこれを行う必要があり、1つのインターフェイスに固執することをお勧めします。つまり、値を直接返すか(可能な場合)、コールバックを使用します。

于 2013-01-29T11:34:35.007 に答える