在function1完成后运行function2

时间:2016-06-25 17:42:37

标签: javascript angularjs

我的控制器由一个函数组成,该函数对服务进行两次函数调用,并从视图中收集一些范围值。

$scope.sendValues = function () {
    MyService.function1($scope.value1, $scope.value2);

    for(var i = 0; i < $scope.arr.length; i++) {
        $scope.value3 = $(".input" + i).val();
        MyService.function2($scope.value3);
    }
};

两个服务函数都发出http请求,它们看起来与此类似:

var tempID = 0;

var function1 = function (value1, value2) {
    return $http({
        method: 'POST',
        url: "someUrl",
        data: {
            valeu1: value1,
            value2: value2
        }
    }).success(function (response) {
        tempID = response.data.id;
    });
};

现在第二个函数需要来自function1的值“tempID”。

var function2 = function (value3) {
    return $http({
        method: 'POST',
        url: "anotherURL",
        data: {
            value3: value3,
            tempID: tempID
        }
   });
};

问题是有时function2在function1完成之前运行,这导致tempID是声明的值0.如何在function2运行之前确保function1完成?我知道我可以把function2放在function1中成功/完成,但是我如何获得在控制器函数中循环的视图值。

3 个答案:

答案 0 :(得分:2)

您可以使用承诺

var function1 = function (value1, value2) {
    return $http({
        method: 'POST',
        url: "someUrl",
        data: {
           valeu1: value1,
           value2: value2
       }
   }).then(function (response) {
       tempID = response.data.id;
       retrun tempID;
   });
};

var function2 = function (value3, tempID) {
return $http({
    method: 'POST',
    url: "anotherURL",
    data: {
        value3: value3,
        tempID: tempID
    }
 });
};

你会这样打电话

function1('some value1', 'some value2').then(function(id){
     function2('your value 3', id).then(function(resp){
          // whatever you want to do with this response
    });
});

答案 1 :(得分:0)

回调本质上是异步的。很明显,有时2将在1之前运行。要解决问题,请将这些函数包含在闭包中。闭包将按顺序执行这些功能,即同步。

答案 2 :(得分:0)

这应该有效。但对于优雅,承诺,回调可能是一个更好的设计。

var function1 = function (value1, value2) {
    return $http({
        method: 'POST',
        url: "someUrl",
        data: {
            valeu1: value1,
            value2: value2
        }
    }).success(function (response) {
        tempID = response.data.id;
        for(var i = 0; i < $scope.arr.length; i++) {
        $scope.value3 = $(".input" + i).val();
        MyService.function2($scope.value3);
        }
    });
};