2014-07-18 17 views
0

我试图确定在以下循环中的最后一个回调函数调用。目前,循环执行速度比内部函数快,并且在最后一次回调之前标志被设置为真。我需要的是仅在最后一次回调期间将标志设置为真。我如何修改下面的代码:在for循环中设置一个标志,用于在同一个循环中调用的函数的回调函数中

// global variable flag 
var flag = false; 
var files = [..]; // some array of files 
var count = files.length; 

for (i = 0; i < count; i++) { 
    var file = files[i]; 
    flag = count - i == 1; // Sets true when last item is processed in the files array 
    request = some-api.get(file.id); 
    request.execute(callback.bind(this)); 
} 

function callback(data){ 
    if(flag){ 
    // Do something with data 
    data.use(); 
    } 
} 
+0

'.execute()'异步吗?如果是这样,你应该将标志传递给回调函数,而不是尝试在全局变量中使用它。 '.bind()'将允许你传递'.execute()'通常发送给它的额外参数。 – jfriend00

+0

'.execute()'是异步的。这是造成这个问题的原因。这不是我的代码,而是我使用的API。因此,我认为我不能将标志传递给回调方法。任何其他想法? – Tom

+0

'.bind()'可以为你解决这个问题。我已经说明了如何在下面的答案。 – jfriend00

回答

1

因为.execute()是异步的,你不能使用一个全球性的标志,因为你不知道有回调通信时的回调将被调用,有没有办法给一个全局标志值为一次调用回调,另一次调用回调的另一次调用。

取而代之,您可以使用.bind()的功能将标志传递给回调函数以将参数添加到该函数。它可以做这样的:

// global variable flag 
var files = [..]; // some array of files 

for (i = 0; i < files.length; i++) { 
    var flag = (i >= files.length - 1); // true when we are on last item 
    some-api.get(files[i].id).execute(callback.bind(this, flag)); 
} 

function callback(flag, data){ 
    if(flag){ 
    // Do something with data 
    data.use(); 
    } 
} 

参数传递给.bind()this指针将被预置到,否则将被发送到回调的参数。因此,基本上.execute()将使用一个参数调用您的.bind()包装,然后在调用实际回调之前,包装器将插入您的参数。只要你知道你的回调参数是如何工作的,你就会得到你想要的。