Javascript关闭不起作用

并尝试应用他们的解决方案(以及至少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函数(注意,我无法在同一JavaScript文件中“写入”消息,因为我需要[角度]向该文件中注入另一个引用,这会导致循环参考,代码将无法运行)

var onError = function (tx, e, syncQueueId) {

mlog.LogSync("DBService/SQLite Error: " + e.message, "ERROR", syncQueueId);

};

我还可以采用什么其他方法阻止它返回同步记录的最后一个“ id”(当它只是出现错误的第一个记录时)?

回答:

… 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

}

以上是 Javascript关闭不起作用 的全部内容, 来源链接: utcz.com/qa/409445.html

回到顶部