2014-09-06 4 views
-1

У меня есть два вопроса относительно обещаний в AngularJS:Как создать свое собственное обещание?

  1. Как создать свое собственное обещание?

Смотрите код ниже:

function controller($http) { 
    var dataCache; 

    function getData(){   

     if(dataCache != null){ 
      // should return my own promise here 
      // to pass the value of 'dataCache' to 'then' immediately 
     } else { 
      return $http.get('...some url ...'); 
     } 
    } 
} 
  1. Как вернуть последнее обещание?

Код:

function controller($http) { 

    var urlArr = ['url1', 'url2', 'url3']; 

    function getDataOneByOne() { 
      // should call $http.get() for the url in the 'urlArr' one after another in a chain 
      // and return the last promise 
    } 
} 
+2

https://docs.angularjs.org/api/ng/service/$q – Ian

+1

Пожалуйста, напишите один вопрос за сообщение в будущем. Постарайтесь писать свои сообщения таким образом, чтобы они были наиболее полезными для сообщества (будущих зрителей). – m59

ответ

2

Что касается второго вопроса, сделать Array.prototype.reduce на urlArr и построить обещание цепи:

function controller($http, $q) { 

    var urlArr = ['url1', 'url2', 'url3']; 

    function getDataOneByOne() { 
     return urlArr.reduce(function (chain, url) { 
      return chain.then(function() { 
       return $http.get(url); 
      }); 
     }, $q.when()); 
    } 
} 

Не забудьте обработать $ HTTP ошибки, хотя.

+0

Ницца, ты избил меня до этого и все равно сделал хорошую работу. У полных библиотек обещаний есть лучшее решение для такого рода вещей, но это хорошо для ограниченного Углового '$ q' api. – m59

2

Для первого вопроса, то я считаю, что вы ищете $q.when(). Он обертывает нормальное значение в обещании и решает его.

function getData(){   

    if(dataCache !== null) { 
    $q.when(dataCache);  
    } else { 
    return $http.get('...some url ...'); 
    } 

} 

getData.then(function() { 

}); 

См. Ответ Кластера на ваш второй вопрос.

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