2017-12-26 6 views
0

Ich bin nicht in der Lage, die Werte in den Mahlzeiten Objekt zu erhalten, obwohl ich am Anfang neues Objekt erstellen haben kann sagen, jeder ein, welche der beste Prozedur Zugriff Variable in Callback-FunktionWie kann ich auf Variable innerhalb von Callback Nodejs zugreifen?

var meals = new Object(); 

passObj.data = _.map(passObj.data, (x)=> {    

    x.mealImageUrl = !_.isNull(x.image_url) ? `${config.image_path}${x.image_url}` : x.image; 

    dbHelpder.query(`select * from meals where meal_category = ${x.category_id}`,(error,result)=>{ 

     meals = x.result; 

     passObj.total = 555 
    }); 

    return x; 
}); 

Antwort

0

Sie müssen callback wieder nach innen verwenden die Rückruffunktion. :) Sie tun etwas asynchron, bedeutet es, es gibt keine Sequenzcodes. (Zumindest, halte ich dies in meinem Kopf, nicht wissen, wie andere denken darüber.) Also, sollte der Code sein:

function somehow(callback) { // you get the result from callback 
    var meals = new Object(); 
    passObj.data = _.map(passObj.data, (x)=> { 
    dbHelpder.query(`select * from meals where meal_category = ${x.category_id}`,(error,result)=>{ 
     meals = x.result; 
     passObj.total = 555; 
     callback(meals); // Here you get the result 
    }); 
    } 
    return x; 
} 

Also, wenn Sie diese Funktion verwenden wollen, sollte es sein

function afterMeals(resultMeals) { 
    // do something on the meals 
} 
somehow(afterMeals); 

eine andere Technologie verwenden kann es ein bisschen klar (wie promise) machen, aber Sie nicht callback eigentlich vermeiden.

+0

So nannten sie es 'callback hell' – Yarco

+0

Danke ich habe es (y) –

+0

@ MäHį JįlläNį Wenn ich dein Problem gelöst habe, bitte mach es als die Antwort, damit ich ein bisschen Ansehen bekommen kann. ;) Aha – Yarco

0

Zunächst kann ich nicht sehen, was passObj genau ist, anscheinend ist es woanders definiert.

Zweitens funktionieren Callback-Funktionen nicht so, wie Sie zu denken scheinen. In der Regel ist ein Grund für die Verwendung asynchroner Aufrufe, sodass die Rückgabe eines Werts nicht sinnvoll ist.

Die Idee ist wie folgt. Normalerweise haben Sie einen Anruf wie folgt aus:

var myFunc1 = function(){ 

    return 42; 

} 

var x = myFunc1(); 

myFunc2(x); 

jedoch, wenn MyFunc1 ist ein asynchroner Aufruf Rückkehr ein Wert ist unmöglich, ohne irgendeine Art von Versprechen mit, das ist ein Thema für sich allein. Wenn also myFunc1 ein asynchroner Anruf war und die 42 z.B. Wenn ein Server einen Wert zurückgibt, wird der Wert null, weil der Rückgabewert noch nicht berechnet und empfangen wird, wenn Sie bei return ankommen.

Dies ist ein Grund für Callbacks eingeführt werden. Sie arbeiten so, dass asynchrone Anrufe möglich sind und Sie nach dem Anruf so weitermachen können, wie Sie möchten. Um auf dem Beispiel oben zu zeigen:

var myFunc1 = function(myFunc2, params){ 

    // do async stuff here, then call the callback function from myFunc1 
    ... 
    myFunc2(x); 

} 

So die asynchrone Funktion gibt nichts zurück. Es macht die Aufrufe oder Berechnungen, die es vornehmen muss, und wenn das erledigt ist (in dem Beispiel, in dem x deklariert und ein Wert zugewiesen wurde), wird myFunc2, die in unserem Beispiel die Callback-Funktion ist, direkt von der asynchronen Funktion aufgerufen.

Lange Rede kurzer Sinn - tun Sie, was Sie mit x direkt in der Callback-Funktion tun müssen.

Verwandte Themen