【问题标题】:how to throw an error once inside a callback function being triggered in a loop in Javascript?如何在Javascript循环中触发的回调函数中抛出错误?
【发布时间】:2012-12-18 23:38:25
【问题描述】:

我需要遍历一组对象并检查回调函数中的值。我的问题是,如果找不到值,我需要抛出一个错误,所以这需要在回调和循环之外。

现在我有这个:

for (i = 0; i < response._conflicts.length; i += 1){
    del_rev = response._conflicts[i];
        // retrieve a document
        that.addJob( 
            "get",
            someID,
            options,
            // callback
            function (response) {
                if (condition 1) {
                    if (condition 2){
                        console.log("gotcha");
                        // run a function                    
                        f.removeDocument(someID+x);
                        return;
                    }
                } 
            },
            function (err) {
                that.error({ "status": 123 });
            }
        );
    } // end of loop

    // now if the loop turns out no results, I need to throw this error
    that.error({ "status": 404 });
    return;

我的问题是,在我的回调检查可以检测是否满足条件之前,第二个 404 错误触发,所以一旦条件满足,我总是以 404 和第二个函数触发结束还有我的f.removeDocument(someID+x) 触发器。

我尝试从回调和循环中删除f.removeDocument(someID+x),只将变量设置为真/假,然后抛出我的错误或调用我的函数。但是,相同的结果 = 变量为 false 并在回调中设置为 true 之前引发错误。

我想我需要将我的404 错误放入循环和回调中,但我不知道如何确保它仅在循环完成且条件未满足时触发一次。

问题
如何在循环中触发的回调函数中一次性抛出错误?

【问题讨论】:

  • addJob() 是一个异步 AJAX 调用,我想..?
  • @inhan:是的,我不能改变它。
  • 那么当你得到任何响应时你就知道循环已经结束了,对吧?
  • 我认为这是问题所在。循环完成,我在收到 AJAX 调用的响应并尝试检查条件之前抛出 404。
  • 在外部范围内使用两个变量:每次 Ajax 作业完成时都会递增的计数器和记录任何 Ajax 调用是否成功的布尔值。对于每个 Ajax 解析,检查计数器是否处于阈值(即 response._conflicts.length),如果是,检查成功布尔值是否曾经设置为 true

标签: javascript loops callback throw


【解决方案1】:

这看起来像是一个异步问题。要将回调作为一种连接操作处理,您需要等待最后一个回调。像这样的模式可能会有所帮助:

var join = (function(n, fn) {
  return function() {
    if(--n === 0) {
      fn();
    }
  }
}) (response._conflicts.length, function() {
  // Check the conditions
});

加入功能将倒计时所需的次数,然后允许您在最后一次调用完成后执行其余的检查。您需要在请求回调中触发join()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2016-12-17
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多