2016-05-04 2 views
0

Ich schreibe ein kleines Skript in Knoten, die einige Daten von einer MongoDB über Monk Adapter greifen und ich kann wirklich nicht herausfinden, warum die Reihenfolge nicht das ist, was ich erwarte.Liste der Versprechen: brauchen Erklärung über die Reihenfolge

Btw, mein Wissen über Versprechen ist nicht sehr weit fortgeschritten:

Der Code ich benutze

function bigRetry(){ 
    return users.find({merchant : true}).then(function(merchants){ 
    merchants.forEach(function(merchant){ 
     console.log('I see a company: '+ merchant.company); 
     return jobs.find({_p_merchant: '_User$' + merchant._id}).then(SO); 
    }) 
    }) 
} 

function SO(jobs){ 
    jobs.forEach(function(job){ 
    console.log('I see a job: '+ job.title); 
    }); 
} 

Was ich erwarte:

I see a company: JobNinja GbR 
monk:queries Job find {"_p_merchant":"_User$jWDNE5b2er"} +0ms 
I see a job: Praktikum Maler und Lackierer 
I see a company: Freelance 
monk:queries Job find {"_p_merchant":"_User$rQzEyiELOH"} +1ms 
I see a job: Praktikum Maler und Lackierer 
I see a company: JobNinja 
monk:queries Job find {"_p_merchant":"_User$27HMaVzZfd"} +1ms 
I see a job: Praktikum Maler und Lackierer 
I see a company: Shore.com 
monk:queries Job find {"_p_merchant":"_User$4doj3eR5kC"} +0ms 
I see a job: Praktikum Maler und Lackierer 

Was ich habe:

I see a company: Freelance 
monk:queries Job find {"_p_merchant":"_User$rQzEyiELOH"} +1ms 
I see a company: JobNinja 
monk:queries Job find {"_p_merchant":"_User$27HMaVzZfd"} +1ms 
I see a company: Shore.com 
monk:queries Job find {"_p_merchant":"_User$4doj3eR5kC"} +0ms 
I see a job: Praktikum Maler und Lackierer 
I see a job: Promoter/in 
I see a job: Koch/Jungkoch ab sofort gesucht 

Wenn jemand kann erklären, warum die Abfragen für die Jobs nach den Firmenabfragen angezeigt werden und nicht "geschachtelt" sind, das würde mir helfen.

Best,

+1

Da in dieser Zeile 'merchants.forEach (Funktion (Händler) {' Sie geben Sie die wunderbare und geheimnisvolle Welt der asynchronen Javascript wieder :) – Yerken

+0

Ok, Ich sehe, sollte ich dann eine Schleife machen? –

+0

Im Ernst, Sie rufen gleichzeitig mehrere asynchrone Funktionen in einer Schleife auf;) – Yerken

Antwort

1

von Diskussion Kopierte
Weil in dieser Linie merchants.forEach(function(merchant){ Sie die wunderbare und geheimnisvolle Welt von Asynchronous JavaScript erneut eingeben :)

Aber im Ernst, berufen sich mehrere asynchrone Funktionen in ein Schleife, zur gleichen Zeit. Was Sie suchen, ist ein Versprechen Sequential Flow Control-Mechanismus. Bluebirds Promise.each könnte einer von ihnen sein, oder Sie können Ihre eigenen schreiben.

Es gibt Promise.all, die Teil des ES6-Standards ist, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all. Es ist jedoch nicht das, was Sie suchen. Es wird Ihnen helfen, das Versprechen von bigRetry zurückzukehren, aber die Ausführung wird in Serie nicht ohnehin

Alternative auftreten Sie einen Blick auf cohttps://www.npmjs.com/package/co nehmen kann, die mit dem Versprechen erstaunlich gut spielt und ist in der Tat die Umsetzung des Generators Testamentsvollstrecker, wird es machen Ihr Code viel einfacher und wahrscheinlich brauchen Sie nicht Bluebird verwenden

Verwandte Themen