Как использовать несколько функций для синхронной работы в JavaScript

Это моя функция:

$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 ответ

Решение

Ваш фактический код уже выполняется updateStartJobManual а также byeSendManualInputDirectly синхронно.

Однако, если ваши функции обрабатывают обещания, обе они преждевременно завершатся выполнением фонового задания. Итак, давайте объединим обещания выполнять одно за другим.

Предположим, ваш byeSendManualInputDirectly (и byeSendManualInputDirectly) сделан так:

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

Таким образом, функция возвращает обещание.

Объединить updateStartJobManual а также byeSendManualInputDirectly Вы можете просто:

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

Я предлагаю вам прочитать несколько статей об обещаниях и понять, как они работают (см. Эту документацию по использованию $q, использует библиотека обещаний angularjs)

Редактировать на основе кода ОП:

просто добавьте возврат к вашей функции updateStartJobManual, сюда:

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

и в вашем saveManualResendDraftдобавьте then() для обработки обещания:

$scope.saveManualResendDraft = function(todo) {
    if ($scope.editMode) 
        updateStartJobManual().then(byeSendManualInputDirectly);
     else 
        console.log('bye');        
};
Другие вопросы по тегам