1

編集

もっと要点を述べさせてください。psuedopromiseの実装を作成しようとしています。ここでの考え方は、非同期呼び出しが受信されるまで実行されないコールバックがあるということです。したがって、実行可能であることが通知されるまで、この関数へのすべての呼び出しを単純にキューに入れています。キューは空になり、関数へのそれ以上の呼び出しはすぐに実行されると想定されますが、何らかの理由で、関数はまだキューに入れられています。これは、何らかの理由で、ランナー関数の再定義が正しく機能していないためです。以下のコードは、私の頭を通り抜けたすべての考えの睡眠不足、欲求不満のバージョンでした。実際のコードは次のとおりです。

function Promise(callback){
  var queue    = []
    , callback = callback
    , runner   = function(){
        queue.push({
          context: this,
          args: Array.prototype.slice.call(arguments, 0)
        });
      }
  ;//var

  runner.exec = function(){
    for(var i = 0, ilen = queue.length; i < ilen; i++){
      var q = queue[i];

      callback.apply(q.context, q.args);
    }

    runner = callback;
  };

  return runner;
}

test = Promise(function(){
  $('<div/>').appendTo('#output').html(Array.prototype.slice.call(arguments,0).toString());
});

test(1,2);
test(3,4);
test.exec();
test(5,6);​

http://jsfiddle.net/a7gaR/


これで壁に頭をぶつけています。関数自体の外部の呼び出しから関数内の変数を再割り当てしようとしています(理想的には、再割り当て関数をコールバックとして渡すことによって)。jsfiddleに投稿した例では、理論的には、親関数に含まれる変数への参照を持つグローバル関数を作成しました。その外部関数を呼び出すと、他の関数が使用している値が再割り当てされることを期待しています。このようには機能しないようです。

window.test = function temp() {
    var val = 7,
        func = function() {
            return val;
        };

    window.change = function() {
        window.test.val = 555555;
        $('<div>Changing ' + val + ' to ' + window.test.val + 
               '</div>').appendTo($output);
        val = window.test.val;
        temp.val = window.test.val;
        func = function() {
            return 'Why isn\'t this working?';
        }
    }

    return func();
}

var $output = $('#output');

$('<div/>').appendTo($output).html('::' + test() + '::');
window.change();
$('<div/>').appendTo($output).html('::' + test() + '::');

http://jsfiddle.net/YhyMK/

4

3 に答える 3

1

2回目に呼び出すときは、という新しいローカル変数testを作成し、その新しい変数を閉じる新しい変数を定義します。オリジナルを呼び出すことによってオリジナルに加えた変更は、2回目の呼び出しには関係ありません。func window.changefuncwindow.change

次の行にも注意してください。

window.test.val = 555555;

val...外部関数の変数を変更/参照しません。ローカル変数ではなく、オブジェクト(たまたま関数)でwindow.test.val指定されたプロパティを参照します。valtest

于 2012-06-30T02:04:00.300 に答える
0

構文が。の関数でローカル変数を参照しようとしていますfunc.varname。それは機能しません、それはローカル変数が機能する方法ではありません。

于 2012-06-30T01:42:51.513 に答える
0

私はついにこの操作を実行する関数を作成しました。その要点はここにあります:https ://gist.github.com/2586972 。

それはこのように動作します...

機能を遅延させたいコールバックを渡してDeferを呼び出します。

var deferredCB = Defer(function(){ console.log(this,arguments) };

deferredCBは、渡したすべての引数を格納し、後日実行できるようにします。

defferedCB(1);
defferedCB(2);

これで、操作を実行する準備ができたら、deferredCBを「実行」するだけです。

defferedCB.exec();

その結果:

// window, 1
// window, 2

deferredCBへの今後のすべての呼び出しは、すぐに実行されます。そして今、私はそれについて考えているので、おそらく、deferredCBを実行前の状態にリセットできるように書き直します(すべての引数を再度保存します)。

それを機能させるための鍵は、ラッパー関数を持つことでした。Javascriptでは、実行中に関数を再割り当てすることはできません。

多田!!!

于 2012-10-01T13:58:42.383 に答える