2017-12-26 14 views
0

私が一番上に新しいオブジェクトを作成しているが、私は食事のオブジェクトの値を取得することができませんよいずれかがコールバック関数の中で最高の手続きアクセス変数である変数コールバックノードにアクセスするにはどうしたらいいですか?

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; 
}); 

答えて

0

を伝えることができますが、内部で再びcallbackを使用する必要がありますコールバック関数:) あなたは何かをしています非同期、つまり、シーケンスコードはありません。あなたはこの機能を使用しようとしているとき、それがあるべき、

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; 
} 

ので:だから、コードがなければなりません(。少なくとも、私は他の人がこのことについてどのように考えるか知らないが、私の心でこれを維持します)

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

他のいくつかの技術を使用してください(promiseのように)それは少し明確にすることができますが、実際にcallbackを回避することはできません。

+0

それは彼らが 'callback hell'と呼んだ方法です – Yarco

+0

ありがとう私はそれを得ました –

+0

@MäHįJįllnį私があなたの問題を解決したら、それを答えにしてください、私は少しの評判を得ることができます。 ;)Aha – Yarco

0

まず、passObjが正確に何かを見ることができません。明らかに、それは他の場所で定義されています。

第2に、コールバック関数は、自分の思うように機能しません。通常、それらを使用する1つの理由は、非同期呼び出しを実装することです。したがって、値を返すことは役に立ちません。

アイデアは次のとおりです。 myFunc1が値を返す非同期呼び出しのとき

var myFunc1 = function(){ 

    return 42; 

} 

var x = myFunc1(); 

myFunc2(x); 

しかし、独自のテーマである約束、のいくつかの並べ替えを使用せずには不可能である。通常は、このような呼び出しがあります。したがって、myFunc1が非同期呼び出しであり、42が返された場合などです。サーバーが返す値が返されたときに返された値はまだ計算されていないので、値を返すだけでその値がnullになります。

これは、コールバックが導入される理由です。彼らは、非同期呼び出しを可能にし、呼び出しが完了した後にあなたが望むように進行する方法で動作します。上記の例を示すには:

var myFunc1 = function(myFunc2, params){ 

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

} 

したがって、非同期関数は何も返しません。これは、必要な呼び出しまたは計算を行い、それらが完了したとき(xが宣言されて値が割り当てられた例)、この例のコールバック関数であるmyFunc2は非同期関数から直接呼び出されます。

ショートストーリーは、コールバック関数の内部で直接xを使って行う必要があります。

関連する問題