2017-08-08 2 views
0

J'ai ce code:

function first() { 
    let promises = two(arg); 
    $q.all(promises).then(() => { 
     console.log("all promises"); 
    }); 
} 

function two(arg) { 
    let promises = []; 
    arg.forEach((ar) => { 
     let promise = funcThatReturnPromise(ar).then(() => { 
      console.log("single promise"); 
     }); 
     promises.push(promise); 
    }); 
    return promises; 
} 

Je veux que tous les "single promise" seront imprimés avant la "all promises" mais en fait la "all promises" imprime avant certains des "single promise".

Comment puis-je le forcer que tous les seront imprimés avant le "all promises"?

J'ai essayé de trouver une solution mais je n'ai pas pu trouver la raison pour cela.

Merci d'avance et désolé pour mon anglais!

Répondre

1

Je viens de tester votre code et n'arrive pas à reproduire votre problème. Chaque "single promise" sera imprimé avant le dernier "all promises" comme devrait l'être le comportement attendu. Si l'une des promesses est rejetée, la branche then de $ q.all ne sera pas exécutée. Mon code d'essai était:

const fakePromise =() => { 
    var deferred = this.$q.defer(); 
    this.$timeout(() => { 
     deferred.resolve(); 
    }, Math.random() * 100); 
    return deferred.promise; 
} 

const two = (arg) => { 
    let promises = []; 
    arg.forEach((ar) => { 
     let promise = fakePromise().then(() => { 
      console.log("single promise"); 
     }); 
     promises.push(promise); 
    }); 
    return promises; 
} 
const first =() => { 
    let promises = two(Array(2000).fill('x')); 
    this.$q.all(promises).then(() => { 
     console.log("all promises"); 
    }); 
}; 

first(); 

Peut-être que si vous avez un autre exemple, je pourrais aider plus.