変数のスコープに問題があります。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」内に独自の値を保持したい
事前にthx
編集: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 )
);
}