Изменение синхронного xmlhhtprequest на асинхронное обещание дает другой результат

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

$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» «Success». Предложите то, что мне здесь не хватает. Я знаю, что обещание вернет объект обещания из документов, но как с этим справиться.

$ 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': ""
But this is always returning [object promise]. да, это то, что возвращает Promises ... обещание - однако, поскольку вы используете его правильно, ответ .then(function(response) { здесь будет ответом, а не обещанием - извините, неправильно его использую ... удалите .then((response) => { return resolve(response) }); - он не делает смысл, поскольку в getAllTasks нет функции resolve
Jaromanda X 19.10.2018 09:50

@JaromandaX хорошо, я понял это, но есть ли способ вернуть данные вместо обещания

Eddy 19.10.2018 09:52

вернулся где? из getAllTasks? нет, он возвращает обещание (после исправления кода)

Jaromanda X 19.10.2018 09:53

о, вы хотите, чтобы $scope.getStatus возвращал результат, а не обещание ... ну, вы не можете .. потому что асинхронный код не может возвращать результаты синхронно

Jaromanda X 19.10.2018 09:54

вы знаете, что ваш код в настоящее время возвращает обещание, которое разрешает одно из 'Success', 'Failed' или ''

Jaromanda X 19.10.2018 09:56

Хорошо. Есть ли способ изменить рабочий код (синхронный код) на асинхронный в этом случае?

Eddy 19.10.2018 09:57

да, верните обещание или используйте обратный вызов - в любом случае $scope.getStatus не может возвращать результат синхронно - как только вы вводите асинхронность, нет возможности "отменить" его - из-за самой природы результата, который возвращается "в непредсказуемая точка в будущем »

Jaromanda X 19.10.2018 10:01

как вы используете / звоните $scope.getStatus? Вот где вам нужно будет внести некоторые изменения в свой код - код, который вызывает getStatus

Jaromanda X 19.10.2018 10:02

который просто возвращает его return $ scope.getStatus (data.input, data.id); в директиве .js для заполнения столбца (запрос данных)

Eddy 19.10.2018 10:07

Итак, почему тот факт, что $scope.getStatus возвращает Promise, является проблемой?

Jaromanda X 19.10.2018 10:13

Мне не удалось найти способ вернуть данные, находящиеся внутри обещания в методе getstatus

Eddy 19.10.2018 10:31

да, но зачем тебе это нужно ... вы просто вызываете его, используя return $scope.getStatus(data.input, data.id); ... так что это какая-то функция, которая работает с return ... значит, что-то вызывает эту другую функцию, и она ожидает результата синхронно? если это так, тогда вам нужно изменить свой код для работы с promise.then - но поскольку этот код - две функции удалены из кода, который вы опубликовали, то больше нечего сказать ... т.е. опубликуйте код у тебя проблема с - в этом случае , код - это код, который не знает, что делать с обещанием

Jaromanda X 19.10.2018 10:34

@JaromandaX отредактировал код.

Eddy 19.10.2018 10:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
13
99
1

Ответы 1

Сделай это:

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

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

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

$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.info($scope.getStatus());

Вы можете сделать этот код более читабельным, отформатировав его лучше, чем OP ... и избегая неявного антипаттерна конструктора Promise.

Jaromanda X 19.10.2018 10:03

Спасибо @Gaurav. Но я получаю здесь сообщение об ошибке $ scope.getStatus.then не является функцией

Eddy 19.10.2018 10:09

отредактировал мой ответ ... попробуйте еще раз. я забыл вызвать метод $ scope.getStatus.

Gaurav Singh 19.10.2018 10:13

@JaromandaX Потому что он написал некоторую логику перед отправкой результата, а не только для разрешения с использованием ответа предыдущего, поэтому я не могу увидеть неявный анти-шаблон конструктора Promise.

Gaurav Singh 19.10.2018 10:15

правильно - значит, вы говорите, что не понимаете обещаний?

Jaromanda X 19.10.2018 10:15

Не здесь, хотя ваш код «лучше», чем OP, конечно, конструктор Promise не имеет большого значения (я понимаю, зачем вам что-то нужно), но проблема в том, что OP хочет является способом сделать так, чтобы асинхронный запрос возвращал результат синхронно ... невозможно ...

Jaromanda X 19.10.2018 10:28

Я думаю, это будет работать в соответствии с вашими потребностями, @Eddy отредактировал код

Gaurav Singh 19.10.2018 11:11

@GauravSingh Но он всегда возвращает пустую строку. Я думаю, что это не вход в getAllTaks (Id). then (функция)

Eddy 19.10.2018 11:31

что такое «условие» в коде, проверьте его значение в консоли и почему вы используете if (condition) {} else if (condition) не является ли оно избыточным? попробуйте запустить в режиме отладки ...

Gaurav Singh 19.10.2018 18:48

@GauravSingh Условия if, else основаны на значении 'input'. Пробовал работать в режиме отладки. Но он не ждет getAllTasks (id) .then (function (response). То есть он вводит условие if, но не разрешает getAllTasks (id) .then

Eddy 22.10.2018 11:32

поэтому проверьте свой метод getalltasks (id), вы должны получить код ошибки в консоли

Gaurav Singh 22.10.2018 16:15

Другие вопросы по теме