2016-03-24 14 views
0

Merhaba, bir buluntudan döndürülen öğelere erişmeye çalışıyorum ve eşzamansız ve geri arama durumuyla ilgili bir sorun yaşıyorum.döndürülen mongoose nesnesinin nesnesini bul

Daha iyi anlaşılması için kod İşte.

function retrieveBudgets(email, callback) { 
     models.User.find({email: email},{budget:true}, function(err,budgets) { 
     if (err) { 
      callback(err, null); 
     } else { 
      callback(null, budgets); 
     } 
    }); 
}; 

retrieveBudgets(user.email, function(err, budgets) { 
    if (err) { 
     console.log(err); 
    } 
    budgets.forEach(function(budget){ 
     console.log(JSON.stringify(budget, null, 4)); 
    }); 

}); 

Yani bu hat console.log(JSON.stringify(budget, null, 4)); düzgün çalıştığını ve json formatında ekrana nesneleri baskı ama nasıl buradan nesneler dizisi her depolamak mı edilir? Aynı satırdaki bir diziye basmaya çalışırsam bir hata alıyorum.

Benzer olan bazı sorular gördüm ama bunlarla herhangi bir yol almam. DÜZENLEME: sayfanın oluşturulmasına callback'inde ile aynı anda yapılması fakat ben bu düşünceleriniz doğru çözümdür olmak göremiyorum böylece ____________________________________________________________ almak o çalışma için biraz kesmek yaptım, ben, yukarı res.render taşındı

var user=req.session.user; 
    res.locals.budgets=[]; 

    function retrieveBudgets(email, callback) { 
     models.User.find({email: email},{budget:true}, function(err, budgets) { 
      if (err) { 
       callback(err, null); 
      } else { 
       callback(null, budgets); 
      } 
     }); 
    }; 

    retrieveBudgets(user.email, function(err, budgets) { 
     if (err) { 
      console.log(err); 
     } 
      res.locals.budgets = budgets.map((function(b){ return b; }); 

     res.render('budget/budget.jade',{ csrfToken: req.csrfToken() }); 
    }); 

Bu, yerel halka aracılığıyla bütçelere erişebilmem için çalışıyor, bu yüzden bu konuyla ilgili herhangi bir geri bildirim yapmanın doğru yolu olduğundan şüphe duyuyorum. retrieveBudgets çağrısından aldığınız budgets dönüş değeri

cevap

2

zaten bir dizidir.

Bu, dizilerinizdeki bir yöntem olan budgets.forEach aramanızla kanıtlanmıştır.

Öğelerden yeni bir dizi oluşturmak için belirli bir ihtiyaç var mı? kolayca yapılabilir: kod

var myNewArray = budgets.map((function(b){ return b; });

bu bir satır bütçe kalemlerinin her içeren yeni diziye özgün bütçeleri dizi map edecektir.

, yeni bir dizi oluşturarak i gerçekten ne yapmak istediğinizi

altındaki yorumlardan tam

güncellemesini yapmanız gerekenler bağlı diğer yöntemler dışında bütçeleri kullanmak toplamak vardır sorgunun bu yüzden bu durumda görünümünde

onu geçebilir, size geri arama içinden görünümü oluşturur ve görünümüne bütçeleri geçmesi gerekiyor:


router.get("/foo", function(req, res, next){ 

    retrieveBudgets(user.email, function(err, budgets) { 
    if (err) { return next(err); } 

    res.render('budget/budget.jade',{ 
     budgets: budgets, 
     csrfToken: req.csrfToken() 
    }); 
    }); 

}); 

Bu işin yapılması için tek ve doğru yol budur.

Geri çağırma işlemini bitirmeyi beklemeden yapmaya çalıştıysanız, budgets dizinizde hiçbir veri bulunmaz. Bu nedenle, geri çağrının yürütülmesini beklemeniz ve daha sonra görünümünüze iletilen budgets (veya tek bir budget ya da her neyse) ile görünümünüzü oluşturmalısınız.

(Bunların vaatleri kullanarak varyasyonları vardır, ancak bunun üstesinden gelmenin daha kolay yolu olarak geri aramaları buluyorum.)

+0

Bunu sanıyordum ama myNewArray'ı dışarıda kullanmaya çalıştığımda bana tanımlanmamış olsa da, bunu kapsam içinde beyan etsem bile, gerçekten ne yapmak istediğimi sorgunun dışındaki bütçeleri kullanmaktır. view – homerjay

+0

cevabın yorumlarına dayanarak güncellendi –

+0

nihayet onunla oraya gittim – homerjay

1
Bu yeşim dosyasına budgets geçecek Eğer yeşim dosyası

res.render('budget/budget.jade',{ 
    csrfToken: req.csrfToken(), 
    budgets: budgets.map(function(b) {return b;}) 
}); 

bir nesneyi geçiyoruz hangi çizgiyi çevirin

ve orada erişmek mümkün olmalıdır.