我的变量范围有问题。我调用一个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”中保留自己的值
事先提前编辑:根据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 )
);
}
答案 0 :(得分: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);
}
}
答案 1 :(得分: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。
答案 2 :(得分:0)
您不应该在循环中调用retrieveAndStoreFiles函数。
你应该让函数调用自己,递增“i”。
通过这种方式,您可以确保在对下一个元素运行函数之前已完成请求。