2016-02-22 4 views
3

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

this.doWork = function() { 
    var deferred = $q.defer(); 
    var a = get('a'), 
    b = get('b'), 
    c = get('c'); 
    $q.all([a.promise, b.promise, c.promise]) 
    .then(function(values) { 
     deferred.resolve(new Test(values[0], values[1], values[2])); 
    }, function(reason) { 
     deferred.reject(reason); 
    }); 
    return deferred.promise; 
}; 

function get(param) { 
    var deferred = $q.defer(); 
    $timeout(function() { 
    if (true) { 
     deferred.resolve({ 
     value: param 
     }); 
    } else { 
     deferred.reject({ 
     message: "Really bad" 
     }); 
    } 
    }, 1000); 
    return deferred.promise; 
} 

(в фактическом коде get() использует $http вместо $timeout, конечно). Вот код Plnkr с кодом, может ли кто-нибудь пролить свет на то, что проблема?

ответ

7

Вы не должны делать .promise на promise объекта, возвращенного get метода, потому что вы уже вернулись promise формы get метода.

$q.all([a, b, c]) 

Когда вы делаете a.promise, b.promise & c.promise все они становятся undefined & тогда $q.all массива стал $q.all([undefined, undefined, undefined]) передавая их $q.all даст undefined результата.

+0

Это действительно проблема (* вытягивает волосы *) - большое спасибо! –

+0

@Aredhel Рад узнать, что .. Спасибо :) –