2015-07-15 1 views
1

Мне нужно вытащить некоторые данные из службы, используя реляционный вызов. В последнее время сервер стал медленным - поэтому я искал способ, возможно, прервать вызов (или, может быть, просто обещание), если приходит новый вызов и говорит моей службе использовать самый последний звонок. Вот вызова службы -Угловой, restangular - прерывание поиска, если в настоящее время добавлен более точный номер

MySearchService.prototype.search = function(query) { 

      return $q(function(resolve, reject) { 
       var url = '/services/search'; 
       Restangular.oneUrl(url, url) 
        .customPOST(query) 
        .then(resolve) 
        .catch(reject); 
      }); 
    }; 

Я думал что-то вроде

.withHttpConfig({hasNewSearch: abort.promise}) <<not sure you can put custom key in here 
abort.resolve(); 

Но я не думаю, что это как цеплять. Я ищу способ отменить вызов, если есть более новый вызов, возможно, это полностью связано с обещанием и вообще не является стандартным? Буду признателен за любые советы. Спасибо!

+0

Примечания вас есть 'тогда (успех, неудача)' антипаттерн там. –

ответ

2

Это действительно крутая проблема, обычно называемая last или flatMapLatest.

// we want something that takes a function and only cares about the last result 
function last(fn){ // fn returns a promise 
    var lastValue = null; // the last promise to check against 
    return function(){ 
    // call the function, and mark it as the last call 
    lastValue = fn.apply(this, arguments); 
    var p = lastValue; 
    return p.then(function validateLast(v){ // call the function, when it resolves 
     if(p === lastValue){ // if we're still the "last call" when we resolved 
      return v; // we're done, successful call 
     } else { 
      // a newer one came, resolve with it and verify no one came since 
      return lastValue.then(validateLast); 
     } 
    }); 
} 

Это позволит вам сделать что-то вроде

MySearchService.prototype.search = last(function(query) { 
      // removed antipattern 
      return Restangular.oneUrl('/services/search', '/services/search') 
          .customPOST(query); 
}); 
+0

Мне еще нужно разрешение, где бы я поместил его в эту логику? Спасибо, кстати, это потрясающе! – ajmajmajma

+0

@ajmajmajma Что значит «мне еще нужно разрешение»? –

+0

@ajmajmajma Вы прочитали https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-thensuccess-fail-anti-pattern –

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

  • Нет связанных вопросов^_^