2017-08-28 4 views
0

Ich bin auf der Suche nach einer Versprechen-Funktion, bis ich das gewünschte Ergebnis habe.Schleife bis Versprechen Funktion geben Ergebnis

Ab jetzt bin ich mit Rekursivität wie folgt aus:

function pull() { 
    dataFactory.pullFunction().then(function(res) { 
     pull()  
    }) 
} 

Aber das gibt mir einige Front-End/style Fehler für meine Ladebalken zum Beispiel.

Ich würde so etwas tun:

function pull() { 
    while (res.status == 'ONGOING') { 
     dataFactory.pullFunction().then(function(res) { 
      // my stuffs 
     }) 
    } 
} 

Aber wenn ich es die pullFunction() versuchen wird nie aufgerufen.

+1

'while (res.status == 'ONGOING')' - ist eine enge Schleife, dass wenn wahr wird nie asynchronen Code ausführen zulassen, und wenn false wird nie wahr –

+1

Vielleicht sollten Sie etwas detaillierter beschreiben, was Sie tun möchten. – Robert

+0

Danke für deine Antwort, ich habe meine Frage bearbeitet – PAscalinox

Antwort

0

Erstellen Sie einfach eine isOngoing Variable

let isOngoing = false; 
function pull() { 
    isOngoing = true; 
    dataFactory.pullFunction() 
    .then(res => { 
     if(<your-condition>) { 
     isOngoing = false; 
     } else { 
     pull(); 
     } 
    }) 
} 

bearbeiten

Sie sind hier mit asynchronen Operationen zu tun, können Sie es nicht in einer Schleife mit dem traditionellen while oder for Schleife. Es sei denn, Ihre Umgebung ermöglicht die Verwendung von async/await Funktionen.

async function pull() { 
    while (res.status == 'ONGOING') 
     await dataFactory.pullFunction().then(function(res) { 
      // my stuffs 
     }) 
} 
+0

Danke für deine Antwort @jkris, aber ich möchte keine Rekursivität verwenden – PAscalinox

+0

Leider kann ich nicht erwarten in angularjs ... – PAscalinox

1

Wenn Sie async/await dann nicht verwenden, können Sie eine Funktion verwenden, die sich selbst aufruft. Dies ist keine echte Rekursion, da sich der Call-Stack nicht wie bei der üblichen (synchronen) Rekursion aufbaut.

Aber Sie müssen mit Versprechen den ganzen Weg halten. So zurückgeben das Versprechen, und weiter mit then, auch auf den ersten Anruf von pull in den Rest Ihres Codes.

Wahrscheinlich möchten Sie auch die Datenblöcke sammeln, die Sie von Ihren Ziehungen in einen Datensatz erhalten.

Ich nehme hier an, dass das Antwortobjekt ein Datenattribut mit dem Datenstück haben wird.

Hier ist, wie das wäre (mit einer Dummy-Implementierung des pullFunction) funktionieren könnte:

function pull() { 
 
    return (function loop(data) { 
 
     return dataFactory.pullFunction().then (res => { 
 
      return res.status === 'ONGOING' 
 
       ? loop(data.concat(res.data)) 
 
       : data.concat(res.data) 
 
     }); 
 
    })([]); 
 
} 
 

 
// Mock implementation 
 
var dataFactory = { 
 
    pullFunction: function() { 
 
     console.log('pull'); 
 
     return new Promise(resolve => { 
 
      setTimeout(_ => 
 
       resolve({ 
 
        status: Math.random() > 0.7 ? 'DONE' : 'ONGOING', 
 
        data: [1,2,3,4] 
 
       }), 
 
      500) 
 
     }); 
 
    } 
 
} 
 

 
// test it 
 
pull().then((data) => { 
 
    console.log('data: ', data); 
 
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Wie die Art und Weise, wie Sie in der Lage waren, die Aufrufmethode prägnant zu halten! Du hast "wahre Rekursion" erwähnt, könntest du mich dorthin führen, wo ich vielleicht Lernressourcen dafür finden könnte? – jkris

+0

Ich habe keine Referenz für Sie, aber beachten Sie, dass, wenn 'loop' aus dem' return'-Ausdruck aufgerufen wird, der vorherige Aufruf von 'loop' bereits beendet war: erst nachdem dieser Aufruf - einige Zeit später - beendet war dann Callback angerufen. Es gibt also keinen Moment, in dem Sie zwei unfertige Aufruf-Instanzen von "loop" haben. Das liegt daran, dass die Aufrufe asynchron erfolgen. In der echten Rekursion laufen die Aufrufe synchron ab, und so würden sich die Aufrufe von "loop" dann stapeln: wenn der tiefste Anruf beendet wird, wird der vorherige fortgesetzt, ... etc. Das passiert hier nicht. – trincot

Verwandte Themen