編集
もっと要点を述べさせてください。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);
これで壁に頭をぶつけています。関数自体の外部の呼び出しから関数内の変数を再割り当てしようとしています(理想的には、再割り当て関数をコールバックとして渡すことによって)。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() + '::');