我试图识别以下循环中的最后一个回调函数调用。目前,循环的执行速度比内部函数快,并且在最后一次回调之前将标志设置为 true。我需要的是仅在最后一次回调期间将标志设置为 true。如何修改以下代码:
// 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();
}
}
最佳答案
由于 .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();
}
}
在 this
指针之后传递给 .bind()
的参数将被添加到原本会发送到回调的参数之前。因此,本质上 .execute()
将使用一个参数调用您的 .bind()
包装器,然后 .bind()
包装器将插入在调用实际回调之前您的参数。只要您声明回调参数并了解其工作原理,您就会得到您想要的结果。
关于javascript - 在 for 循环中设置一个标志,以便在同一循环内调用的函数的回调函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828537/