Q.all
не может запускаться перед вашим forEach
, так как forEach
является синхронным.
Но на самом деле вы помещаете элементы в массив после вызова Q.all. Ваш способ использования промисов немного неудобен: не нужно использовать отложенный в промисе!
Кроме того, вы не хотите нажимать deffered, а обещание, которое оно держит, после его отклонения или разрешения. См. ниже дополнительную информацию о том, как «обещать» асинхронную функцию.
Отложенные используются для определения промисов из простого асинхронного кода на основе обратного вызова. Поскольку doSomething()
возвращает обещание (вы используете .then()
), вы можете просто сделать:
var a = [1,2,3,4,5];
var promises = [];
a.forEach(function(item,index){
var promise = doSomething().then(function(data){
return Q(true);
});
promises.push(promise);
});
Q.all(promises).then(function(data){
console.log("something!!");
});
Затем промисы будут напрямую заполнены промисами без каких-либо задержек.
РЕДАКТИРОВАТЬ: поскольку вы спрашиваете о том, что doSomething
не поддерживает обещание, вот что вы можете сделать:
Допустим, doSomething
принимает в качестве параметра обратный вызов для выполнения после некоторой асинхронной задачи.
Затем вы можете обернуть doSomething
таким образом:
function doSomethingPromise(){
var defered = Q.defer();
doSomething(function(err,data){
if(err){
defered.reject(err);
}
else{
defered.resolve(data);
}
});
return defered.promise;
}
а затем используйте doSomethingPromise()
, как указано выше, вместо doSomething
, так как этот возвращает обещание.
person
Tiesselune
schedule
10.06.2015
item
иindex
. Даже если вы получите ответы, я не уверен, что вы можете напрямую использовать их для решения своей реальной проблемы. - person thefourtheye   schedule 10.06.2015