2015-11-27 4 views
0

Я использую angularjs в своем проекте. Я сталкиваюсь с проблемой. На странице есть две кнопки A и B, они называют ту же функцию, которая получает удаленные данные с сервера. Когда я нажимаю «А», а затем «В», он отправляет два запроса, но иногда запрос «В» возвращается раньше, а затем запрашивает «А», поэтому последний я визуализую данные из запроса А на странице, которую я должен отображать данные из запроса В. Теперь у меня есть решение ниже:

app.controller("controller", function($scope) { 
    $scope.lastTimeStamp = null; 
    $scope.getData = functio() { 
     $scope.lastTimeStamp = new Date().getTime(); 
     var temp = angular.copy(t); 
     $http({}).success(function() { 
      if($scope.lastTimeStamp == temp) { 
       // this is the data from last request 
      } 
     }) 
    } 
}); 

каждый раз, когда вызов $ scope.getData(), я обновляю $ scope.lastTimeStamp и вар темп с тем же значением для обеспечения $ scope.lastTimeStamp является фактической последним, и сравнить его с темп в обратном звонке , Это работает. Но эта ситуация является общей, мой проект, если он решается таким образом, каждый раз, когда мне нужно делать это, у которого нет бизнес-логики с бизнес-логикой. поэтому я задаюсь вопросом, есть ли общее решение для решения этого? любая помощь?

+0

Вы должны использовать обещания – Himanshu

+0

спасибо, но ключ заключается в том, как проверить, какой ответ является последним, обычным способом, а не проверять его в каждом запросе HTTP. – aldrich

ответ

0

Вы никогда не знаете, когда запрос вернет ответ. Поэтому вы должны использовать обещания. Угловое имеет сервис $ q для этой свиньи. Итак, вы можете создать переменную, чтобы удержать обещание A, а когда она вернется, запустите запрос из метода B. Но у этого есть некоторые побочные эффекты. Что произойдет, если пользователь нажмет кнопку B и никогда не нажимает A?

// контроллер

var deferA; 

$scope.methodA = function() { 
    deferA = $q.defer(); 
    $http('service-a-url').then(function (response) { 
    // render your response 
    deferA.resolve(reponse); 
    }, function (error) { 
    // notify about the error 
    deferA.reject(error); 
    }); 
} 


$scope.methodB = function() { 
    if (deferA) { 
    $q.when(deferA).then(function() { 
     $http('service-b-request').then(function() { 
     // render your data 
     }); 
    }); 
    } 
} 

Вы можете использовать $q.all слишком

+0

См. [Является ли это «Отложенным Антипаттером»?] (Http: //stackoverflow.com/questions/30750207/is-this-a-deferred-antipattern) – georgeawg

+0

Я вижу вашу точку зрения, но вам нужно выполнить некоторую визуализацию, прежде чем разрешать отсрочку. Или запросите одну и ту же кнопку внутри одной кнопки. Но в вопросе вы хотите иметь два отдельных метода для каждой кнопки. Было бы лучше сгруппировать все в один метод и сгруппировать запрос с помощью '$ q.all' – Raulucco

+0

Спасибо за ответ, на самом деле нет методовA и methodB, кнопка A и кнопка B вызывают один и тот же метод и просто проходят в разных аргументах. но использование обещания, похоже, может решить его, я не мог бы попробовать его сейчас по какой-то причине. Я попробую это завтра. – aldrich

0

Сохранить обещание от предыдущей мыши и цепи от этого.

var vm = $scope; 
vm.prevClickPromise = $q.when(0); 

vm.doClick = function doClick(someRequest) {   
    vm.prevClickPromise = vm.prevClickPromise.then (function() { 
     //Make and return Http request 
     return $http(someRequest); 
    }) .then (function (response) { 
     //render data 
     vm.data = response.data; 
    }) .catch (function (error) { 
     //log error 
    }) 
}; 

приковав от обещания предыдущей клики, последующие $ запрос HTTP будет ждать, пока запрос предыдущего $ HTTP не решен либо с данными или ошибкой. Если предыдущие запросы уже разрешены, последующие запросы начнутся немедленно.

Обратите внимание, что данные возвращаются по-разному с методом .then, чем с помощью метода .success.

Deprecation уведомление

В .success и .error методы $http службы устарели. Для получения дополнительной информации об устаревании (или, если необходимо, сбой) методов .success и .error см. AngularJS $http Service API Reference.

+0

извините за ответ позже, я попробую обещать на вашем пути. – aldrich

+0

отредактирован для одной функции щелчка с различными аргументами – georgeawg

Смежные вопросы