2014-09-02 8 views
2

Одна из моих переменных в методе разрешения имеет зависимость от другой переменной, возможно ли разделить то же обещание среди переменных в методе разрешения?

Кажется, что $ route.current.locals хранит разрешенные переменные, однако, когда var2 обрабатывается, $ route.current.locals имеет значение null, поскольку var1 еще не разрешен. То, что я пытаюсь что-то вроде этого:

$routeProvider.when('/report/:ruleId', { resolve: { 
    var1: ['$route', 'service', function ($route, service) { 
     return service.getRequest(); 
    }], 
    var2: ['$route', 'service', function ($route, service) { 
     return service.getAnotherRequest($route.current.locals.var1.id); 
    }] 
}}); 
+0

Вам нужно использовать $ q.all [см. Документы] (https://docs.angularjs.org/api/ng/service/$q) и поместить результаты в объект {var1: value, var2: value} –

+0

somePromise создается в области var1, а var2 использует разрешенные данные somePromise. Я обновил код. –

+0

О, тогда используйте .then(). (Также все это должно быть сделано в службе). –

ответ

4

Я надеюсь, что это будет работать:

$routeProvider.when('/report/:ruleId', { resolve: { 
    vars: ['$route', 'service','$q' function ($route, service) { 
     var defer = $q.defer(), 
     data = []; 
     service.getRequest().then(function(firstResponse){ 
      data.push(firstResponse); 
      service.getAnotherRequest(firstResponse.id).then(function(secondResponse){ 
       data.push(secondResponse); 
       defer.resolve(data); 
      }); 
     }) 

     return defer.promise; 

    }], 

}}); 
1

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

$routeProvider.when('/report/:ruleId', { resolve: { 
    bothVars: ['$route', '$service', function ($route, $service) { 
     return $service.getRequest(). 
     then(function(response1) { 
      return $service.getAnotherRequest(response1.data.id). 
      then(function(response2) { 
       return { 
        var1: response1.data, 
        var2: response2.data 
       }; 
      }); 
     }); 
    ] 
}}); 

Это может получить немного дикий, если гнездо слишком глубоко, но я думаю, что это хорошо. Я не люблю это решение, но это лучшее, что я нашел для этой конкретной проблемы. Одно последнее замечание: не предисловие к вашим собственным услугам с '$'. Угловое использует это соглашение для своих собственных услуг, чтобы избежать конфликтов.

+0

Мне пришло сообщение, что если вы контролируете конечные точки обслуживания (API), лучшим решением может быть возвращение всех данных, которые вам нужны, из одного запроса, если это возможно. – threeve

+0

Это может быть решение, но было бы неплохо, если бы мы могли это сделать. Думаю, этот путь гораздо более грязный. –