如何在javascript中使用多个函数同步工作

时间:2018-01-08 10:20:09

标签: javascript angularjs function promise synchronous

这是我的功能:

$scope.saveManualResendDraft = function(todo) {
    if ($scope.editMode) {
        updateStartJobManual();
        byeSendManualInputDirectly();
    } else {
        console.log('bye');
    }
};

我有两个函数 updateStartJobManual() byeSendManualInputDirectly()

我想完全完成第一个功能然后我需要移动到第二个,怎么办?是否有可能使用承诺?我需要一些代码。

function byeSendManualInputDirectly() {
    if ($window.confirm("Do you want to send this messages?"))
        addProfSms();
    else
        console.log('no');
}

function addProfSms() {
    $http.post('/api/sendprofsms', $scope.draft).then(function(response) {
        swal("Good job!", "Message sended!", "success")
        //  $state.reload();
    });
}

function updateStartJobManual() {
    $http({
        method: 'POST',
        url: '/api/updatestartjobmanual',
        data: $scope.draft
    }).then(function(response) {
        $scope.currentItem = response.data;
        $scope.todos[$scope.currentItemIndex] = response.data;
        $scope.editMode = false;
        console.log('draft:', response.data);
        $state.reload();
        // toastr.success('Updated Successfully');
    }, function(response) {
        console.log('error');
    });
}

1 个答案:

答案 0 :(得分:1)

您的实际代码已同步执行updateStartJobManualbyeSendManualInputDirectly

但是,如果您的功能正在处理承诺,则两个都将在后台作业运行时提前结束。所以,让我们将承诺链接起来,一个接一个地执行。

假设你的byeSendManualInputDirectly(和byeSendManualInputDirectly)是这样的:

function byeSendManualInputDirectly(){
   return $http.post('myApiAddress', {myParam: true});
}

这样,函数返回一个promise。

要连接updateStartJobManualbyeSendManualInputDirectly,您可以简单地:

updateStartJobManual().then(function(){
   byeSendManualInputDirectly()
});

我建议你阅读一些关于promises的文章,并了解它们是如何工作的(参见this关于$ q使用的文档,promises angularjs使用的库)

根据OP的代码进行编辑:

只需在函数updateStartJobManual中添加一个返回值,即:

function updateStartJobManual() {
    return $http({
        method: 'POST',
        ...
}

并在saveManualResendDraft中添加一个then()来处理承诺:

$scope.saveManualResendDraft = function(todo) {
    if ($scope.editMode) 
        updateStartJobManual().then(byeSendManualInputDirectly);
     else 
        console.log('bye');        
};