Javascript closure not working
Solution 1:
… var i … async(function() { … // errorLogging(tx, error, id); (function(a, b, c) { errorLogging(a, b, idsArray[c]); })(tx, error, i); … })
That's rather useless, because the i
variable already does have the wrong values there. You need to put the wrapper around the whole async callback, closing over all variables are used within the async callback but are going to be modified by the synchronous loop.
The easiest way (works always) is to simply wrap the complete loop body, and close over the iteration variable:
for (var i = 0; i < paramsArray.length; i++) (function(i) { // here
var query = queryArray[i];
var params = paramsArray[i];
var id = idsArray[i];
window.logger.logIt("id: " + id);
tx.executeSql(query, params, function (tx, results) {
incrementSyncDownloadCount(results.rowsAffected);
}, function(tx, error) {
if (error.message.indexOf("are not unique") > 0 || error.message.indexOf("is not unique") > 0) {
incrementDuplicateRecordCount(1);
return false;
}
errorLogging(tx, error, id);
return true;
});
}(i)); // and here
You also might pass all variables that are constructed in the loop (and depend on the iteration variable) as the closure arguments. In your case, it might look like this:
for (var i = 0; i < paramsArray.length; i++) {
(function(query, params, id) { // here
window.logger.logIt("id: " + id);
tx.executeSql(query, params, function (tx, results) {
incrementSyncDownloadCount(results.rowsAffected);
}, function(tx, error) {
if (error.message.indexOf("are not unique") > 0 || error.message.indexOf("is not unique") > 0) {
incrementDuplicateRecordCount(1);
return false;
}
errorLogging(tx, error, id);
return true;
});
}(queryArray[i], paramsArray[i], idsArray[i])); // here
}
Or you identify the async callback, and wrap only that:
for (var i = 0; i < paramsArray.length; i++) {
window.logger.logIt("id: " + idsArray[i]);
tx.executeSql(queryArray[i], paramsArray[i], function (tx, results) {
incrementSyncDownloadCount(results.rowsAffected);
}, (function(id) { // here
return function(tx, error) {
// ^^^^^^ and here
if (error.message.indexOf("are not unique") > 0 || error.message.indexOf("is not unique") > 0) {
incrementDuplicateRecordCount(1);
return false;
}
errorLogging(tx, error, id);
return true;
};
}(idsArray[i]))); // and here
}