2017-08-08 5 views
0

Ich habe diesen 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; 
} 

Ich möchte, dass alle der "single promise" wird vor dem "all promises" gedruckt werden, sondern tatsächlich die "all promises" druckt vor einigen der "single promise".

Wie kann ich es erzwingen, dass alle "single promise" vor der "all promises" gedruckt werden?

Ich habe versucht, eine Lösung zu finden, aber ich konnte den Grund dafür nicht finden.

Vielen Dank im Voraus und Entschuldigung für mein Englisch!

Antwort

1

Ich habe gerade Ihren Code getestet und kann Ihr Problem nicht replizieren. Jeder "single promise" wird vor dem endgültigen "all promises" ausgedruckt, wie es das erwartete Verhalten sein sollte. Wenn eines der Versprechen abgelehnt wird, wird der Zweig then von $ q.all nicht ausgeführt. Mein Testcode war:

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(); 

Vielleicht könnte ich mehr helfen, wenn Sie ein anderes Beispiel haben.

Verwandte Themen