我已经阅读了这些问题:
并尝试应用他们的解决方案(以及至少1/2个其他实现),但没有一个正在运行。
这是具有循环的函数:
ExecuteQueryWhereQueryAndParamsBothArrays: function (queryArray, paramsArray, idsArray, success, fail, errorLogging) {
var hasError = false;
$rootScope.syncDownloadCount = 0;
$rootScope.duplicateRecordCount = 0;
$rootScope.db.transaction(function (tx) {
for (var i = 0; i < paramsArray.length; i++) {
window.logger.logIt("id: " + idsArray[i]);
var query = queryArray[i];
var params = paramsArray[i];
var id = idsArray[i];
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;
}
// this didn't work: errorLogging(tx, error, id);
// so I wrapped in in an IIFE as suggested:
(function(a, b, c) {
errorLogging(a, b, idsArray[c]);
})(tx, error, i);
return true;
});
}
}, function () {
fail();
}, function () {
success();
});
这里是正在编写我的消息的errorLogging函数(注意,我不能&#34;在同一个javascript文件中写#34;因为我需要to [angular]将另一个引用注入此文件,它将导致循环引用并且代码不会运行)
var onError = function (tx, e, syncQueueId) {
mlog.LogSync("DBService/SQLite Error: " + e.message, "ERROR", syncQueueId);
};
我可以采用哪种方法来阻止它返回最后一个&#34; id&#34;我的同步记录(当它只是第一个有错误的记录时)?
答案 0 :(得分:4)
… 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
}