… var i …
async(function() { …
// errorLogging(tx, error, id);
(function(a, b, c) {
errorLogging(a, b, idsArray[c]);
})(tx, error, i);
… })
那是没有用的,因为
i变量在那里确实有错误的值。您需要将包装器放在整个异步回调中,关闭所有在异步回调中使用的变量,但这些变量将由同步循环修改。
最简单的方法(始终有效)是简单地包装完整的循环体,并覆盖迭代变量:
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您还可以将循环中构造的所有变量(并取决于迭代变量)作为闭合参数。在您的情况下,可能看起来像这样:
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}或者,您确定异步回调,然后仅包装:
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}


