2013-03-14 33 views
1

我有一个变量范围的问题。我调用一个Web服务(异步),并在回调中我想使用这个变量。问题是这个变量已经改变了,所以我想存储它的内容,但它没有工作,因为我想要的。你可以看到,我有一个3文件名的数组。我尝试在服务器上检索它们,如果它们不存在,则创建它们。 var requiredFile被修改为异步。我想保持自己的价值函数 “retrieveAndStoreFiles” 内提前Javascript可变范围,存储内容以在回调中使用它

THX

编辑:根据罗曼的答复

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

这是工作http://jsbin.com/anemep/1/edit – Diode 2013-03-14 10:53:01

+0

你可以让你尝试了什么jsbin演示 – Diode 2013-03-14 10:53:28

回答

0

你不应该在循环中调用retrieveAndStoreFiles函数。

你应该调用自己的函数,递增“我”。

这样您就可以确定在下一个元素上运行函数之前已经完成了请求。

+0

是的,我已经试过了,这是我第一次尝试,但我像这样做有同样的问题 – isy 2013-03-14 10:52:23

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了解有关黑暗魔法的更多信息。

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); 
    } 
}