2014-01-23 86 views
0

我有一個貓鼬數據庫查詢避免被迫回調

var player; 
Users.findById(req.user._id,function(err,user){  
    console.log('>>> user: '+user); //----2 
    player = user; 
    }); 
console.log('>>> player: '+player); // ----1 

在此代碼1執行之前2因爲2是一個回調中。

有沒有辦法避免這種情況?

+0

假設findById是異步則沒有 –

+1

是的,把它放在同一個回調,或在另一個回調。承諾幫助。 – Tibos

回答

2

你必須創建另一個功能(可以讓說log)在與player變量相同的命名空間中,放console.log('>>> player: '+player);,並在分配player後致電log

因此,player變量爲findById回調和log函數可見。

下面是代碼:

var player; 
Users.findById(req.user._id,function(err,user){  
    console.log('>>> user: '+user); 
    player = user; 
    log(); 
}); 
function log() { 
    console.log('>>> player: '+player); 
} 
1

您需要從回叫中調用1。例如,類似的東西:

var player; 
Users.findById(req.user._id,function(err,user){ 
    console.log('>>> user: '+user); // ----1 
    player = user; 
    showPlayer(); 
}); 
var showPlayer = function() { 
    console.log('>>> player: '+player); // ----2 
} 
+0

這是行不通的,因爲你在'player = user'之前調用showPlayer()' – Curious

+0

確實。修正了錯誤,謝謝 – Stilltorik

0

試試這個:

var player; 
Users.findById(req.user._id,function(err,user){  
    console.log('>>> user: '+user); //----1 
    player = user; 
    console.log('>>> player: '+player); // ----2 
}); 

UPDATE:

,這可能是一種替代

var mainFunction = function(player){ 
    if(!player){ 
    Users.findById(req.user._id,function(err,user){  
     console.log('>>> user:', user);  
     mainFunction(user); 
    }); 
    } else { 
    console.log('>>> player: '+player); 
    } 
}; 
mainFunction(); 
+0

對不起,我沒有解釋,但總的來說,我不想把我的其他整個代碼放在'Users.findById(... function(){' – laggingreflex

+0

他們創建一個單獨的函數並在回調中進行調用 – rafaelcastrocouto