2017-10-30 1 views
0

Im Tutorial ein Beispiel gibt es wie unter einer Folge von Befüllvorgänge Aufbau: example linkJavascript: Warum funktioniert meine eigene promitifizierte Sequenz nicht wie in einem Tutorial angegeben?

function getJSON(url) { 
    let prom = new Promise((resolve, reject) => { 
    setTimeout(()=>{resolve(`I'm am ${url}`);}, (Math.random()*3000 + 1000)); 
    }); 
    return prom; 
} 

let story = {}; 
story.chapterUrls = ['www.fakegoogle.com', 'www.fakeyahoo.cn', 'www.fakeamazon.ca']; 

let sequence = Promise.resolve(); 

function addHtmlToPage(val) { 
    console.log(val); 
} 

// Loop through our chapter urls 
story.chapterUrls.forEach(function(chapterUrl) { 
    // Add these actions to the end of the sequence 
    sequence = sequence.then(function() { 
    return getJSON(chapterUrl); 
    }).then(function(chapter) { 
    addHtmlToPage(chapter); 
    }); 
}) 

ich einige Änderungen, um es getan habe, ist meine eigene Version wie folgt:

function getJSON(url) { 
    let prom = new Promise((resolve, reject) => { 
    setTimeout(()=>{resolve(`I am ${url}`);}, (Math.random()*3000 + 1000)); 
    }); 
    return prom; 
} 

let story = {}; 
story.chapterUrls = ['www.fakeweb1.com', 'www.fakeweb2.com', 'www.fakeweb3.com']; 
let sequence; 

function addHtmlToPage(val) { 
    console.log(val); 
} 

story.chapterUrls.forEach(function(chapterUrl) { 
    sequence = sequence || getJSON(chapterUrl); 
    sequence.then(function() { 
    return getJSON(chapterUrl); 
    }).then(function(chapter) { 
    addHtmlToPage(chapter); 
    }); 
}) 

Meine Theorie ist, da getJSON bereits eine Promise zurückgibt, gibt es keinen Grund, einen anfänglichen Promisified-Wert wie im Tutorial einzuführen.

In meiner Version sind die Ladeaktionen jedoch völlig zufällig, während in dem Beispiel des Tutorials die dreistufigen Ladeaktionen immer in der richtigen Reihenfolge sind.

Könnte jemand darauf hinweisen, was der Schlüssel zu einer Verkettung ist? Braucht es IMMER einen Anfangswert? Nie redundant? Vielen Dank.

Antwort

1

Sie haben noch das Ergebnis zuweisen .then zurück zu sequence Aufruf:

sequence = sequence.then(...) 

Andernfalls werden Sie sequence.then() nur auf den ursprünglichen Wert von sequence aufrufen.

Könnte jemand darauf hinweisen, was der Schlüssel zu einer Verkettung ist?

Was ich oben gesagt habe.

Benötigt es IMMER einen Anfangswert?

Nun, Sie müssen irgendwo anfangen, aber wie das passiert, liegt an Ihnen.

+0

Danke für den Hinweis auf meinen Fehler. In der Regel ist ein solches Muster, das zu Beginn eine redundante leere Versprechen einführt, sehr üblich? Welchen Nutzen bringt es im Vergleich zu meiner Version? –

+0

Ich weiß nicht, wie häufig es ist, aber es ist nicht ungewöhnlich. Ich würde es ein bisschen sauberer betrachten, weil die Logik, die Versprechungen zur Verkettung hinzufügt (Ihre 'forEach'-Schleife), nicht überprüfen muss, ob der Start existiert oder nicht. Ich finde es leichter, darüber nachzudenken. –

Verwandte Themen