Синхронные функции с сервисами (api) в angularJs - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть некоторые функции в Angularjs, которые занимаются бизнесом, также называемые сервисами для получения данных, как я могу заставить мой код работать синхронно (что я надеюсь, что моя первая функция завершает выполнение следующей?)

angularJs

    $scope.modalAction = function () {
         $scope.UploadFile(),
         $http.post(UriTempV2 + "/Template/InsertTemplate?OwnerRefId=" + $scope.OwnerRefId, $scope.newItem)
           .then(function (response) {
                   //llenar newTemplate
                  CloseModal();    
           }, function (error) {
             alert("Ocurrio un Error!!");
         });        
    }
};
$scope.UploadFile = function () {
    if (document.getElementById('file').files.length !== 0) {
        var file = document.getElementById('file').files[0];
        var uploadUrl = UriTempV2 + "/Template/TemplateFile";
        var fd = new FormData();
        fd.append('file', file);
        fd.append('systemName', $scope.newItem.templateFile);
        fd.append('instanceId', '698757BA-3D34-461D-A8FA-2D7E6BCDDC3C');
        fd.append('enviroment', '90B28DB1-EE45-4F85-A1D4-0C0706737607');
        fd.append('metaData', '{}');

        $http({
            url: uploadUrl,
            method: "POST",
            data: fd,
            headers: { 'Content-Type': undefined }
        }).then(function (response) {
            if (response.status === 200) {
                $scope.TemplateFile = response.data;
                $scope.newItem.templateFile = $scope.TemplateFile.SystemName;
                $scope.newItem.outputOriginalName = $scope.TemplateFile.OriginalName;
                if ($scope.newItem.outPutType != 'bodyMail') {
                    $scope.CreateFields();
                }
            } else {
                alert("Ocurrio un Error!!");
            }
        }, function (error) {
            alert("Ocurrio un Error!!");
        });
    }

    var templateFile = $scope.newItem.templateFile;
    return templateFile
};
$scope.CreateFields = function () {
    var uploadUrl = UriTempV2 + "/Template/Sync/" + $scope.newItem.id + "/" + $scope.newItem.templateFile;
    $http.get(uploadUrl);
};

Идея состоит в том, что функция UploadFile выполняется, внутри этой функции CreateFields и, в конце этого, выполняется служба "/ Template / InsertTemplate? OwnerRefId =", когда последняяПо окончании будет выполнена функция CloseModal.

1 Ответ

0 голосов
/ 01 октября 2019

Платформа AngularJS не поддерживает синхронные запросы. Кроме того, многие браузеры отказались от синхронных запросов в главном потоке из-за негативных последствий для пользователя. Вместо этого используйте цепочку обещаний для создания последовательных XHR.

Из документов:

Синхронный запрос

Примечание: начиная с Gecko30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), Blink 39.0 и Edge 13, синхронные запросы в основном потоке устарели из-за их негативного влияния на взаимодействие с пользователем.

Синхронные запросы XHRчасто вызывают зависания в сети. Но разработчики, как правило, не замечают проблему, потому что зависание проявляется только в плохих условиях сети или когда удаленный сервер медленно реагирует. Синхронный XHR теперь находится в состоянии устаревания. Рекомендуется, чтобы разработчики отошли от синхронного API и вместо этого использовали асинхронные запросы.

Для получения дополнительной информации см.

...