http.post().success()将变量传递给success()匿名函数作用域问题



我正在努力使这个工作:

$http.post('/route/path', {'username': $scope.threadedUsers[currentIndex].name}).
    success(function(data) {
        $scope.threadedUsers[currentIndex].ID = data._id;
        $scope.threadedUsers[currentIndex].pic = data.profile_picture[0];
    }).
    error(function(data) {
        //error stuff here
    });

美元范围。threaddusers是一个动态填充的JSON对象数组所以美元范围。threadedUsers[0] ={"ID":"‘图片’:","消息":[],"lastTimestamp":"}

currentIndex是一个局部变量,它指向$作用域的哪个索引。

当前正在操作的threaddusers数组。

问题是在success匿名函数中,currentIndex在一个新的作用域中。现在我可以把currentIndex放在$scope中,但考虑到这是唯一的原因,这似乎是不好的做法。

是否有一个外部值传递给成功回调函数(为索引)?还是使currentIndex成为$scope变量的唯一方法?

你遇到了javascript for/while循环的一个非常常见的问题/误解,它是同步和异步函数。当异步函数(在本例中是HTTP post回调函数)执行时,同步循环已经运行到完成,循环计数器变量已经处于最后的结束值。

只需将代码重构为处理单个用户的helper方法。

function updateUser($scope, user) {
  $http.post('/route/path', {'username': user.name}).
    success(function(data) {
      user.ID = data._id;
      user.pic = data.profile_picture[0];
  }).
  error(function(data) {
    //error stuff here
  });
}
//Here's the code you omitted but is essential to your question
var updateInScope = updateUser.bind(null, $scope);
$scope.threadedUsers.forEach(updateInScope);

问题的发生似乎是因为currentIndex在某个for循环中。

有很多方法可以避免它,其中之一就是像Peter Lyons那样重构代码。

另一种选择,您可以像这样记住闭包中的currentIndex:

(function (rememberedIndex) {
    $http.post('/route/path', {'username': $scope.threadedUsers[rememberedIndex].name}).
    success(function(data) {
        $scope.threadedUsers[rememberedIndex].ID = data._id;
        $scope.threadedUsers[rememberedIndex].pic = data.profile_picture[0];
    }).
    error(function(data) {
        //error stuff here
    });
}(currentIndex));

实际上,您也可以使用相同的变量名称currentIndex,但它可能会对稍后看到代码的人造成混淆。

(function (currentIndex) {
    $http.post('/route/path', {'username': $scope.threadedUsers[currentIndex].name}).
    success(function(data) {
        $scope.threadedUsers[currentIndex].ID = data._id;
        $scope.threadedUsers[currentIndex].pic = data.profile_picture[0];
    }).
    error(function(data) {
        //error stuff here
    });
}(currentIndex));

相关内容

  • 没有找到相关文章

最新更新