2016-05-04 14 views
1

Ich versuche derzeit, ein Tool zu erstellen, um eine dynamische Menge an Versprechen zu verketten. Hier ist mein Code:Erstellen Sie ein leeres JavaScript-Versprechen

// NB: This is made using angular's $q, but this applies to anything else 
promiseChain = function(array, passedPromise) { 
    let chain = $q((resolve, reject) => resolve()); 
    for (let elem of array) 
     chain = chain.then(_ => passedPromise(elem)); 
    return chain; 
}; 

und hier ist mein Testcode:

// This returns a timeout wrapped in a promise 
let testFn = function(s) { 
    return $timeout(function() { 
    console.log(s); 
    }, 500); 
}; 

let promise = makePromiseChain([1,2,3,4,5,6,7,8,9], testFn); 
promise.then(_ => console.log('finished')); 

Dies funktioniert. Doch was ärgert mich ist die erste Zeile von promiseChain:

$q((resolve, reject) => resolve()) 

Gibt es keine andere Möglichkeit, ein leeres, Selbstauflösungs Versprechen zu schaffen, oder die Kette zu beginnen? Ich fühle mich schmutzig mit diesem Code. :/

+0

Normalerweise verwenden wir dazu 'Array.prototype.reduce()' - http://stackoverflow.com/a/25730751/3478010 –

+0

Ihre 'passedPromise' muss eine Funktion sein, kein Versprechen, sonst' passePromise (elem) würde werfen. –

Antwort

1

können Sie einfach $q.when oder $q.resolve verwenden:

chain = $q.resolve(); // or the alias $q.when() 

Ein ES6 Versprechen Entschlossenheit Promise.resolve() ist, so resolve statt when könnte leicht auf die nächste Person Blick auf den Code verwenden.

Verwandte Themen