当前位置: 首页 > 面试题库 >

Javascript关闭不起作用

谢清野
2023-03-14
问题内容

并尝试应用他们的解决方案(以及至少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
}


 类似资料:
  • 问题内容: 浏览器无法正确识别的原因是什么: 只有这是公认的: 这是否打破了XHTML支持的概念? 注意:此声明至少对于所有IE(6-8 beta 2)都是正确的。 问题答案: XHTML 1规范说: 给定一个其内容模型不是元素的空实例EMPTY(例如,空的标题或段落),请不要使用最小化形式(例如use 和not )。 XHTML DTD将脚本元素指定为:

  • 基本上,我试图建立一个报警应用程序,其中有一些预定义的日期和时间按钮。我一开始就尝试使用AlarmManager和广播接收器,但都不起作用。所以,我使用了alarmManager的前台服务,但仍然,当应用程序被摧毁时,警报不会发出。我是个新手。我试着在网上搜索,但我没有运气。希望这里有很多人来帮助我。提前谢了。 myservice.java AlarmReceiver.java

  • 问题内容: 浏览器无法正确识别的原因是什么: 只有这是公认的: 这是否打破了XHTML支持的概念? 注意:此声明至少对于所有IE(6-8 beta 2)都是正确的。 问题答案: XHTML 1规范说: С.3。元素最小化和空元素内容 给定一个其内容模型不是元素的空实例(例如,空的标题或段落),请不要使用最小化形式(例如use 和not )。 XHTMLDTD将脚本元素指定为:

  • 问题内容: 我的代码如下所示。我的课有一个可选的var BottleLayer有一个方法。 这段代码使用可选的链接,可以在我的类中很好地编译: 现在,我想构造一个使用相同代码的闭包: 但是我得到一个编译错误: 找不到成员“ jiggle” 作为解决方法,我可以强制展开 或者我当然可以使用成熟的可选绑定,但是我宁愿不使用。我确实认识到可选链接只是语法糖,但是很难看出为什么这种语法糖会因为在处理程序中

  • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 本地npm-packages可以按预期工作,但是对我来说,让全局安装的软件包运行是不可能的。它甚至不会引发任何错误,它只是不执行任何操作(快递,咖啡等。) 在我想使用咖啡脚本之前,这并没有

  • 问题内容: 我有以下代码添加eventListener 它按预期方式正常工作。.稍后在另一个功能中,我尝试使用以下代码删除事件侦听器 但是偶数监听器没有被删除..为什么会发生?removeEventListener()是否有问题?注意:此处区域类似于document.getElementById(’myId’) 问题答案: 这是因为两个匿名函数是完全不同的函数。您的参数不是对先前附加的函数对象的引