angularjs выполняет последовательные действия по условию

#ajax #angularjs #deferred

#ajax #angularjs #отложено

Вопрос:

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

Я думаю, что могу сделать это с помощью отложенных материалов, поскольку у меня нет большого опыта в этом. Можете ли вы дать мне некоторую информацию, как это сделать?

Пример кода:

 .html
<input type='button' ng-start='start()' ng-end='end()' >

.js
$scope.start = function(){
    $http.get(url, data).success(function(result){})
}
$scope.end = function(){
    //show result from first function
}
  

Ответ №1:

Пытался сделать это с использованием $ q, но, похоже, $ q не нужен.

 .html
<input type='button' ng-mousedown='start()' ng-mouseup='end()' >
<div ng-show="loaded amp;amp; resolved" ng-bind="processedResult"></div>

.js
$scope.start = function(){
    $scope.resolved = false;
    $scope.loaded = false;
    $http.get(url, data).success(function(result){
        $scope.loaded = true;
        $scope.processedResult = processResult(result);
    });
};
$scope.end = function(){ 
    $scope.resolved = true; 
};
  

Комментарии:

1. не могли бы вы, пожалуйста, показать, как вы будете отображать информацию в функции end()? например, console.log(???)

2. Какая информация? Результат $http.get ? Возможно, он еще не готов — когда пользователь отпустил кнопку до того, как мы получили ответ от сервера. Но в любом случае вы можете использовать watcher, он все равно сработает: $scope.end = function(){ $scope.$watch('data', function(data){ if(!!data){console.log($scope.data);} }); $scope.resolved = true; };

3. да, результат $ http.get. кажется, наблюдатель недостаточно хорош … я все еще думаю о promise и . затем метод в end()

4. Зачем вам нужны данные внутри функции end()? У вас это уже есть при обратном вызове. В случае с . затем внутри end() — он не будет доступен, если пользователь будет удерживать кнопку мыши при получении результата $http.

5. мне нужен результат только после того, как пользователь отпустит кнопку. но пользователь может отпустить кнопку до завершения запроса ajax. В этом случае я должен подождать, пока не будет выполнен $http.get … $ watch должен работать, я думаю, ты попробуешь. Но мой внутренний голос говорит, что это должно быть лучшим решением…

Ответ №2:

Я думаю, я решил свою проблему с помощью функции pretty promise.

 .html
<input type='button' ng-start='start()' ng-end='end()' >
  

.js

 $scope.start = function() {

    promise = $q.when($scope.ApiCall())
        .then(function(result){
            return result.data;
        }, function(error){
            console.log(error);
        })
    ;
};

$scope.end = function() {

    promise.then(function(result){
        processResult(result.datat);
    });

};

$scope.ApiCall = function(){

    var data = {};

    return $http.get(url, {params: data});
}
  

Комментарии:

1. Сам метод $ http возвращает обещание. Я обновлю свой ответ.

2. Ну, неважно. Вы пробовали этот пример? Работает ли это в обоих случаях? Я все еще не понимаю, почему вы не подготавливаете полученные данные в функции simple .success и не показываете их только тогда, когда пользователь отпускает кнопку. Насколько я понимаю ваш вопрос, нет никакой разницы, где обрабатывать результат $ http. Вам нужно только не показывать обработанный результат, пока пользователь не отпустит кнопку, не так ли? Я думаю, что дополнительный $ q усложняет логику в этом случае. На самом деле у вас здесь два обещания.

3. Посмотрите, в вашей версии метод processResult() будет вызываться сразу после выполнения $http.get, независимо от того, удерживает пользователь или отпускает кнопку. я прав?

4. итак, если, скажем, в processResult() я хочу console.log(результат) , он появится сразу после выполнения $http.get , даже если у вас есть $scope.resolved , я не понимаю, как я могу предотвратить выполнение console.log …

5. Подождите. В вашем вопросе вы не хотели показывать ответ пользователю. ng-show не покажет его пользователю, пока не произойдут оба события. Вы по какой-то непонятной мне причине хотите выполнить код после обоих событий?