Изменение синхронного xmlhhtprequest на асинхронное обещание дает другой результат - PullRequest
0 голосов
/ 19 октября 2018

У меня возникли проблемы при преобразовании синхронной функции в асинхронную.существующий код выглядит следующим образом:

$scope.getTask = function (input, id) {
                    var result = '';
                    if (condition) {
                        // Get all tasks.
                        var tasks = $scope.getAllTasks(id);
                        if (!angular.isUndefined(tasks)) {
                            var result = 'Failed';
                            for (var i = 0; i < tasks.length; i++) {
                                if (condition) {
                                    result = 'Success';
                                    break;
                                }
                            }
                        }
                    }
                    else if (condition) {
                        result = 'Failed';
                    }
                    else {
                        if (input != null || input != '') {
                            result = input.toLowerCase();
                        }
                    }
                    return result;
                }

                $scope.getAllTasks = function (id) {
                    var xhr = new XMLHttpRequest();
                    var url = "/api/workflow/" + id;
                    xhr.open("GET", url, false);
                    xhr.send();
                    return JSON.parse(xhr.responseText);
                }

Но теперь мне нужно сделать этот асинхронный вызов, поэтому я попытался использовать обещания, но это не помогло.Это не разрешается должным образом.Пожалуйста, найдите то, что я пробовал

$scope.getStatus = function (input, id) {
                        return new Promise((resolve, reject) => {
                        var result = '';
                        if(condition){ 
                            getAllTasks(id).then(function(response){
                                var tasks = response.data;
                                if (!angular.isUndefined(tasks)) {
                                    var status = 'Failed';
                                    for (var i = 0; i < tasks.length; i++) {
                                    if (condition) {
                                        result = 'Success';
                                        break;
                                    }
                                }
                                }
                                resolve(result);
                                return result;
                            });

                            resolve(result);

                        }
                        else if (condition) {
                            result = 'Failed';
                        }
                        else {
                            if (input != null || input != '') {
                               result = input.toLowerCase();
                            }
                        }
                    resolve(result);
                            return result;
                        });
                    }


                    var getAllTasks = function (id) {
                            const url = "/api/workflow/" + id;
                             return $http({method: 'GET', url})
                                .then((response) => {
                                    return resolve(response)
                                });
                    }

Но это всегда возвращает [обещание объекта].Мне нужно вернуть значение в виде строки, как «Failed» «Успех».Подскажите, что мне здесь не хватает.Я знаю, что обещание вернет объект обещания из документов, но как с этим справиться.

$ scope.getStatus используется в директивах для заполнения столбцов в jquesry datatable.Фрагмент кода ниже

 'sTitle': "<strong>" + $translate("list.StatusColumn") + "</strong>",
                                    'mData': function (data, type, val) {
                                        return $scope.getStatus(data.input, data.id);
                                    },
                                    'width': "16%",
                                    'defaultContent': ""

1 Ответ

0 голосов
/ 19 октября 2018

Сделайте это:

во-первых, не обрабатывайте ваш http-запрос здесь, если вы обрабатываете его в своем другом обещании:

var getAllTasks = function (id) {
                            const url = "/api/workflow/" + id;
                             return $http({method: 'GET', url});   
                    }

секунда: прекратите возвращать что-либо из функции обратного вызова этого обещания каквы возвращаете результат, который вы также устанавливаете в resol, и вы можете получить его в обработчике успеха функции затем:

$scope.getStatus = function (input, id) {
                        var result = '';
                        if(condition){ 
                            getAllTasks(id).then(function(response){
                                var tasks = response.data;
                                if (!angular.isUndefined(tasks)) {
                                    result = 'Failed';
                                    for (var i = 0; i < tasks.length; i++) {
                                    if (condition) {
                                        result = 'Success';
                                        break;
                                    }
                                }
                                }

                                return result;
                            });

                            return result;

                        }
                        else if (condition) {
                            result = 'Failed';
                        }
                        else {
                            if (input != null || input != '') {
                               result = input.toLowerCase();
                            }
                        }

                            return result;

                    }

console.log($scope.getStatus());
...