1

変数のスコープに問題があります。Webサービス(非同期)を呼び出し、コールバックでこの変数を使用したいと思います。問題は、変数がその間に変更されたため、そのコンテンツを保存したいのですが、希望どおりに機能しないことです。

var requiredFiles = ['config.json','resa.json', 'customers.json'];

retrieveAndStoreFiles(requiredFiles);


...

function retrieveAndStoreFiles(requiredFiles){

    for (var i= 0; i < requiredFiles.length; i++) {

         //I want to store the content of requiredFile in order to use it below
         retrieveFileOnServer(requiredFiles[i], function(response){

            if (response.items.length == 0 ) {

           //I have tried several things but requiredFile is always equal to 'customers.json'
           console.log(requiredFiles[i]);
           createNewFile(requiredFile[i], function(response){   

        });
    }
 }

ご覧のとおり、3つのファイル名の配列があります。それらが存在しない場合は作成されますが、サーバー上でそれらを取得しようとします。var requiredFileは、非同期であるため変更されます。関数「retrieveAndStoreFiles」内に独自の値を保持したい

事前にt​​hx

編集:Romainの答えに従って更新されたコード

EDIT2

for (var i = 0; i < requiredFiles.length; i++) {

        retrieveFile(requiredFiles[i], (function (index) { 

            console.log(index); //works
            var index = index; // index is still not accessible with that
            return function (response) { // function(response, index) is not possible, i must have only one parameter
            console.log(index); // index is not defined
            if (response.items.length == 0) {
                console.log(response);
                createNewFile(requiredFiles[index], function (response) {

                });
            }

        }

    })(i));
}

私はあなたの解決策を組み合わせようとしましたが、それでもうまくいきません、誰かが私が欠けているものを教えてもらえますか?(申し訳ありませんが、JavaScriptは初めてです)

EDIT3

function retrieveFile(fileName, callback) {

var request = gapi.client.request({
    'path': '/drive/v2/files',
    'method': 'GET',
    'params': {
        q : "title='"+fileName+"'"
    }           
}); 

request.execute(function(resp) {
    callback(resp);
});
}

私が試してみると:

for(var i = 0; i < requiredFiles.length; i++) {
     window.setTimeout(
        ( function(arg1) {

            return function() {

               console.log(requiredFiles[arg1]);
            };
        } ) ( i ),
    1000
    );
}

それは機能しますが、このコードは機能しません:

for(var i = 0; i < requiredFiles.length; i++) {
    retrieveFile(requiredFiles[i],
        ( function(arg1) {

            return function(reponse) {

               console.log(requiredFiles[arg1]); //arg1 is undefined
            };
        } ) ( i )
    );
}
4

3 に答える 3

4
function retrieveAndStoreFiles(requiredFiles) {

    for (var i = 0; i < requiredFiles.length; i++) {

        (function (index) {
            //I want to store the content of requiredFile in order to use it below
            retrieveFileOnServer(requiredFiles[index], function (response) {

                if (response.items.length == 0) {

                    console.log(requiredFiles[index]);
                    createNewFile(requiredFile[index], function (response) {

                    });
                }

            });

        })(i);
    }
}
于 2013-03-14T11:02:16.060 に答える
1
retrieveFileOnServer(requiredFile, (function(requiredFile) {return function(response){
    if (response.items.length == 0 ) {

        //I have tried several things but requiredFile is always equal to 'customers.json'
        console.log(requiredFile);
        createNewFile(requiredFile, function(response){ 
            //...
        });
    }
}})(requiredFile));

問題はrequiredFile、 のスコープ内で一度しか存在しないことですretrieveAndStoreFiles。そして、常に最後に見られた値を取ります。これは、開き括弧と閉じ括弧の数と正しいものがあればfunction(response)、変数requiredFileが正しい値に設定されている関数のスコープチェーンに新しいエントリを作成する必要があります。

ダーク マジックの詳細については、 https: //developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures を参照してください。

于 2013-03-14T10:54:02.163 に答える
0

ループ内でretrieveAndStoreFiles関数を呼び出さないでください。

「i」をインクリメントして、それ自体を呼び出す関数が必要です。

このようにして、次の要素で関数を実行する前に、要求が完了したことを確認します。

于 2013-03-14T10:41:49.497 に答える