0

私のコードは、クロムである種の量子決闘状態をもたらしundefined、配列にプッシュされると関数が変化する宇宙を呼び出しているようです...不気味です

この関数を使用してそれらをコールバックチェーンするために、次のコードを使用して関数の配列を構築していますhttps://gist.github.com/3609831

console.log "creating stack"

ids = (id for id of @s3) # an array of integers

stack = [callback]
console.log stack

for ssid of @s3
  new_func =  ((cb) => @idb.load_s3(ssids.shift(),cb))
  console.log new_func
  stack.push new_func
  console.log stack

console.log "stack done"

奇妙なのは、実際には機能しているように見えますが、正しい引数を使用したすべての関数呼び出しが行われているようですが、コンソールでもこれを取得します(私のフォーマットとコメントを使用)

> creating stack

# callback added to array correctly
> [function () { return _this.start(true); }]

# function generated correctly
> function (cb) { return _this.idb.load_s3(ssids.shift(), cb); } 

# but the function doesn't get added to the array !!!!!!!
> [function () { return _this.start(true); }, undefined × 1]

> stack done

# and the undefined from the array can't be executed of course, verified my line number
> Uncaught TypeError: undefined is not a function 

これは、機能したものの...機能しなかったことを意味しているようです...なぜなら...配列にプッシュされるとnew_funcが未定義に変わるからです...

WTF ???

ここで何が起こっているのか、誰か手がかりがありますか?

私はクロームv21を使用しています

..。

編集:fyi @ idb.load_s3関数はスコープ内にあり、これの一部が壊れている場合はロードされないindexedDBからデータをロードするため(そしてコールバックが起動するため)、機能していることがわかります。

..。

EDIT2:これがjavascriptです。これについては、まったく違いや奇妙なことは何もありません。読みにくいだけです。

var id, ids, new_func, ssid, stack,
  _this = this;

console.log("creating stack");

ids = (function() {
  var _results;
  _results = [];
  for (id in this.s3) {
    _results.push(id);
  }
  return _results;
}).call(this);

stack = [callback];

console.log(stack);

for (ssid in this.s3) {
  new_func = (function(cb) {
    return _this.idb.load_s3(ssids.shift(), cb);
  });
  console.log(new_func);
  stack.push(new_func);
  console.log(stack);
}

console.log("stack done");

..。

編集3:問題の一部は、Chromeのコンソールがおそらく非同期であるため、console.logの呼び出し後、console.logが実際に出力される前に、最後のアイテムがスタックからポップされたように見えることに気づきました(コードはここには示されていません)。アレイの内容!!! したがって、スタックを実行するために関数(参照されている要点を参照)を呼び出さない場合、残りは正常に機能しているように見えます。

ただし、これは、未定義が関数ではないこと(配列から未定義をポップして実行しようとしているなど)について不平を言う例外の謎を解決しません...それでも奇妙です!

..。

編集#4:load_s3関数はここにあります:https ://github.com/gnatters/neuroanatomist/blob/master/app/assets/jax/models/asset_loader.js.coffee.erb#L118 実際のバージョンのコードここで質問されるのは、#L145のload_everythingの同じファイルにあります

4

1 に答える 1

0

私はそれを解決しました!同じように見える問題には2つの部分があります。まず、編集3と同様に、配列には、関数がプッシュされた場所に未定義の項目が含まれているように見えます。ただし、これはchromeの非同期コンソールの癖(バグ?)のように見えます。これにより、console.log呼び出しから配列の実際のログ記録までの間に、関数が配列から削除されます。

問題の2番目の部分も見た目が欺瞞的でした。申し訳ありませんが、質問をするときにこれがそれほど重要であるとは思いませんでした。リンクされた要点(現在は改訂されています)では、関数は配列から追加の関数をポップして実行しようとしていましたが、これはもちろんすべての未定義を試みることになります。見つけるのは簡単ではありません...

すべては順調です。遊んでくれてありがとう ;)

于 2012-09-04T23:45:48.113 に答える