2012-02-17 2 views
1

Я использую библиотеку асинхронной (https://github.com/caolan/async) на узел пытается выполнить несколько БД запросов асинхронной с mongoskin (https://github.com/guileen/node-mongoskin)Node асинхронные библиотеки связывания этого

Проблема при использовании функции карты как так

app.post '/events', (req, res) -> 
    storage.events.getByUser req.session.authId, (events) -> 
    async.map events, storage.codes.getCountByEvent, (err, results) -> 
     res.send results 

является обязательным @ глобальным пространством имен в функции getCountByEvent, может ли кто-нибудь с опытом работы с асинхронной библиотекой дать мне рекомендации по наилучшему способу исправить это?

Вот образец storage.codes реализации

class Codes 
    constructor: (db) -> 
     db.bind 'codes', 
      getCountByEvent: (event, callback) -> 
       @.find(event: event._id).toArray (err, res) -> 
        callback res.length 

     return db.codes 

exports.Codes = Codes 

вызывающего getCountByEvent за пределы async.map она будет прекрасно работать

Заранее спасибо

+0

Толстая стрелка. Используй это. – thejh

+0

Это действительно не работает, я пробовал. getCountByEvent: (event, callback) => –

ответ

2

Вы можете создать версию getCountByEvent, который привязан к storage.codes объект:

async.map events, storage.codes.getCountByEvent.bind(storage.codes), ... 
+0

Да, это сработает, я прыгал по пути с асинхронной структурой, чтобы правильно привязать контекст. Я приму этот ответ, если никто не примет его. Благодарю. –

+0

@BrianWigfield Ну, это обычный способ привязать контекст итератора. Async использует Array :: map за кулисами; если вы сделали то же самое прямо, вам придется привязать итератор таким же образом. Только альтернатива делает то же самое вручную 'bound -> (args ...) storage.codes.getCountByEvent args ...' - но зачем беспокоиться, когда у вас есть 'bind'? – Flambino

+0

Это, безусловно, самый простой способ. 'Async' не поддерживает передачу в аргументе context. Если это на стороне клиента, предложение @ Flambino также работает. – loganfsmyth

Смежные вопросы