2016-03-19 6 views
0

Değeri, ikinci sözle ilgili sorunu açıklamaktan daha kolay görecek şekilde haritaya döndürmek istediğiniz yere ilişkin bir javascript sözüm var. Bildiğim kadarıyla değer veremediğimi biliyorum ama bunun için daha iyi bir çözüm olup olmadığını soruyorum. TeşekkürElde ettiğim sonucu harita işlevine nasıl döndürebilirim

Kodum:

const _     = require('lodash') 
    Boom    = require('boom'), 
    When    = require('when'), 
    User    = require('../../models/user'); 

var users; 
/** 
* Contact core functionality 
*/ 
users = { 


    /** 
    * Find user by id 
    * 
    * @param  {id} user id 
    * @returns  {Promise(User)} User 
    */ 
    findById: (id) => { 
     if (_.isEmpty(id)) { 
      return When.reject(Boom.badRequest('User id missing.')) 
     } 
     return User.get(id).run().then((user) => { 
      if (user) { 
       return When.resolve(user) 
      } 
      return When.reject(Boom.notFound('No user registered with provided id.')) 
     }).error((error) => { 
      return When.reject(error) 
     }); 
    }, 

    /** 
    * Returns all contacts of user from database 
    * @returns  [{Promise(Contact)}] contacts 
    */ 
    findContacts: (userId) => { 
     if (_.isEmpty(userId)) { 
      return When.reject(Boom.badRequest('User id missing.')) 
     } 
     return User.get(userId).run().then((user) => { 
      if (user) { 
       if(_.isObject(user.contacts)){ 
        user.contacts = _.map(user.contacts, (contact) => { 
         this.findById.then((user) => { 
          contact.user = user 
         }) 
         return contact 
        }) 
        return When.resolve(user.contacts) 
       } 
       return When.reject(Boom.notFound('No contacts registered with provided user.')); 
      } 
     }).error((error) => { 
      return When.reject(error) 
     }) 
    }, 
} 

Ve burada sorunu:

   user.contacts = _map(user.contacts, (contact) => { 
        this.findById.then((user) => { 
         contact.user = user 
        }) 
        return contact 
       }) 
+0

kullanın 'Promise.all'. – Bergi

+0

@Bergi Koduma bir örnek verebilir misiniz? Çok teşekkürler –

+0

Lodash haritasını kullanmayın. Haritanın yerini kullan. when.map (array, yourFunction) .then (resultsArray => {/ * tada * /} ' – Wainage

cevap

0

size, böyle map ve reduce gibi kendi yineleyicinızı, ne zaman kullanmalıyım söz kitaplığı kullanıyorsanız yana Dizilerinizi işleyin.

Burada dikkat edilmesi gereken son derece önemli olan tek şey, map, "oportünistik" olarak çalıştırıldığında (her şeyi aynı anda paralel olarak çalıştırır), reduce ise örtüşmeyle birlikte seri olarak çalıştırılmasıdır. Diğer bir deyişle, 1000 kullanıcıdan oluşan bir diziniz varsa, map (muhtemelen) veritabanınıza bir kerede 1000 istek gönderecek, reduce ise her veritabanı isteğini tamamlayana kadar bitmeyecektir.

Yani kod aşağıdaki gibi görünebilir:

// This mutates user.contacts, so you don't need to worry about the 
// 'initial value' in your reducer function 
When.reduce(user.contacts, (carry, contact) => { 
    return this.findById.then((user) => { 
     contact.user = user 
    }) 
}); 

işlemek kullanıcıların bir ton varsa, daha küçük, makul büyüklükte diziler dizisi içine yığın veri daha mantıklı olabilir; Her yığıntaki kullanıcılara reduce parça ve map olur. Bu, dizinin seri olarak yapıldığından çok daha hızlı işlenebileceği anlamına gelir, ancak veritabanınızı kullanma riski olmadan. sözler bir dizi

düzenlemek

// This mutates user.contacts, so you don't need to worry about the 
// 'initial value' in your reducer function 
// It also returns the array of users as `allContacts` 
var allContacts = When.reduce(user.contacts, (carry, contact) => { 
    return this.findById.then((user) => { 
     contact.user = user 
     carry.push(user); 
     return carry; 
    }) 
}, []); 
+0

Yukarıdaki sözünü kullanarak bu kimliği tam nesne kullanıcı almak istiyorum Bu hata alıyorum this.findById bir işlevi değil ben bir şey budur findById bir sözdür –

+0

Bir ok işlevi kullanıyorsanız, bu '' Sözün dışında ne oldu (ya da daha doğrusu, ok işlevinin kendisi dışında). Bu şeyin ne olduğunu ve oradan devam et. Hızlı bir çözüm istiyorsanız, bir kapanış değişkeni kullanın ('allow scope = bu;' ... 'scope.findById().') – Andrew

+0

şimdi çalışıyor ancak –