【问题标题】:callback function in loop to fire only once循环中的回调函数只触发一次
【发布时间】:2014-05-13 16:05:52
【问题描述】:

我有一个循环,遍历一个运行带有回调的函数的对象。问题是我希望回调仅在所有项目都经过循环后运行......而不是每次都运行。

$scope.myArray = [];
Object.keys($scope.obj).forEach(function(key) {
    var curNode = $scope.obj[key];

    if ( curNode ) {
        if ( x = 3 ) {
            $scope.myArray.push(curNode);
            myFunction({
                //do something before the callback,
            }, myCalback( myArray ) );
        }
    }
});

$scope.myCallback = function ( arry ) {
    //do something ONCE with arry
}

【问题讨论】:

  • if ( x = 3 ) { BOOM
  • 那么为什么不在forEach之后调用回调呢?
  • 在 if(x=3) 之前还有其他不使用回调的条件可以满足
  • 你没看到错字吗?你写的是if(x=3) 基本上是if(true),所以每次迭代时if 都是真的。

标签: javascript angularjs loops callback


【解决方案1】:

还有一个bugx = 3
'=' 是赋值 '==' 是没有类型比较的相等。

$scope.myArray = [];
Object.keys($scope.obj).forEach(function(key) {
var curNode = $scope.obj[key];

if ( curNode ) {
    if ( x == 3 ) {
        $scope.myArray.push(curNode);
        myFunction({
            //do something before the callback,
        });
    }
}
});

$scope.myCallback = function ( arry ) {
//do something ONCE with arry
}

$scope.myCalback( $scope.myArray ) ;

【讨论】:

    【解决方案2】:

    编辑:

    这不会触发回调,除非有匹配的项目并且仅在完成迭代后触发:

    $scope.myArray = [];
    var run = false;
    
    Object.keys($scope.obj).forEach(function(key) {
        var curNode = $scope.obj[key];
    
        if ( curNode ) {
            if ( x == 3 ) {
                $scope.myArray.push(curNode);
                myFunction({
                    //do something before the callback,
    
                }, function() {run = true} );
            }
        }
    });
    
    $scope.myCallback = function ( arry ) {
        //do something ONCE with arry
    
    }
    
    if (run) $scope.myCallback($scope.myArray);
    

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      相关资源
      最近更新 更多