0

このような関数の配列を作成しています。配列内のURLは正しいですが、最終的に配列リスト内のこの情報をループすると、 x [1]のfuntはurlに格納された最後の値を参照し、同時にx[0]は正しいです。x [0]のURLと一致するように内部URLを調整する方法はありますか?anon-functionにパラメータを入れることを考えていましたが、それが機能するかどうかはわかりませんでした。また、自分でデータツリーを作成し、function.parent [0]のように関数の親を参照し、要素0を呼び出すことができるかどうかもわかりませんでした。最後のアイデアは、DOMの論理的な考え方だったと思います。

var newArray = new Array();
    for(var i=0;i<fileUrls.length;++i) {
        var url = fileUrls[i];
        var x = [];//new Array();
        x = [url,
            function(){
                displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
            }, 
            function(e){
                if(DEBUG) console.log('Error creating gallery thumbnail');
                alert('There was a problem creating a thumbnail');
                MA.hideMessage();
            }
        ];
        newArray.push(x);
    }
   pollingThrottler(2,newArray, function(a,b,c){ 
            //alert(a+"\n-----\n"+b+"\n-----\n"+c);
            //alert(bentleyPlugins.createThumbnailForPath(a,b,c));
            //alert(a);
                            //a does not reference the correct item.
            createThumbnailForPath(a,b,c);
            return;
        },function(){
            alert("success!");
        });

実際のコードです。

4

2 に答える 2

2

次のような配列要素のジェネレーター関数が必要です。

function genElement( url ) {
 return [url,
  function(){
    displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
  }, 
  function(e){
    if(DEBUG) console.log('Error creating gallery thumbnail');
    alert('There was a problem creating a thumbnail');
    MA.hideMessage();
  }
 ];
}    
arrayList.push( genElement( myUrl ) );

基本的に、コードで行われることは、すべての関数要素が同じurl変数を参照し、ループの過程でその値を変更することです。

ジェネレーター関数を使用すると、ジェネレーター関数を呼び出すときにURLのコピーが生成されます。これにより、すべての要素が参照する「独自の」url変数を持ちます。

編集

ただし、コードとパフォーマンスを読みやすくするために、@ dystroyの回答をお勧めします。これは、私の意見では、このようなことを行うためのより良い方法です。

于 2012-09-28T13:39:42.910 に答える
1

配列を使用するのではなく、オブジェクト指向のjavascriptを使用する必要があります。

function Thing(url) {
    this.url = url;
}
Thing.prototype.display = function(){
 displayFile(this.url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
};
Thing.prototype.doSomething = function(){
   if(DEBUG) console.log('Error creating gallery thumbnail');
    alert('There was a problem creating a thumbnail');
    MA.hideMessage();
};

その後、あなたは呼び出すことができます

arrayList.push(new Thing(url));

その後x.display()、正しいURLを使用します。

これは、JavaScriptでのOOPに関する実用的な読み物です。

編集 :

必要な配列/オブジェクトを取得するための補足的なメソッドは次のとおりです。

Thing.prototype.asArray = function(){
   var _this = this;
   return [this.url, function(){_this.display()}, this.doSomething];
}

しかし、それはあまり明確ではなくなり始めています...

于 2012-09-28T13:40:10.227 に答える