2014-07-02 20 views
7

Projektuję funkcję synchronizacji klient/serwer. Klient wysyła kilka zmienionych zdarzeń do serwera. Serwer wykona, skasuje lub zmieni stan na żądany status produktu. Po operacji bazy danych serwer musi wysłać podsumowanie klientowi.Jak wykonać synchroniczne wywołanie z mangusta i nodejs

Poniżej znajduje się fragment kodu mojego serwera, zaprojektowany z mangustą i restify.

var EventModel = mongoose.model('Event', eventSchema); 
server.post("/sync", function (req, res, next) { 
    var events = req.params.events; 
    var created = [], deleted = [], updated = []; 
    events.forEach(function (elem) { 
     if (elem.status == 0) { 
      // Delete 
      EventModel.remove({ _id: elem.uuid }, function (err, event) { 
       if (!err) deleted.push({uuid: elem.uuid}); 
      }); 
     } else if (elem.status == 1) { 
      // Create and update uuid 
      var event = new EventModel(elem); 
      event.save(function (err, doc) { 
       if (!err) { 
        elem.uuid = event._doc._id; 
        created.push(elem); 
       } 
      }); 
     } else if (elem.status == 2) { 
       // Update 
      EventModel.findOne({ _id: elem.uuid }, function (err, event) { 
       event.save(function (err, doc) { 
        if (!err) updated.push({uuid:elem.uuid}); 
       }); 
      }); 
     } 
    }); 
    // Notify client what are processed. 
    // PROBLEM: created, deleted, updated are always empty! 
    res.send({processed: {created: created, deleted: deleted, updated: updated}}); 
}); 

Od mangusta zrobić CRUD w sposób asynchroniczny, odpowiedź created, deleted i updated są zawsze puste. Czy jest jakiś sposób, aby pozwolić operacji mongoose w serii?

+4

Musisz nauczyć się pisać asynchroniczny kod. W szczególności spójrz na 'async.forEach', który obsłuży wywołania zwrotne i pozwoli ci uruchomić po zakończeniu wszystkiego. – SLaks

+1

Sprawdź ten link - http://stackoverflow.com/questions/17181248/making-mongoose-js-queries-run-synchronously/17296329#17296329 –

+1

jeszcze jeden - http://stackoverflow.com/questions/24185367/mongoose- find-data-by-looping-on-tablica-of-models/24190334 # 24190334 –

Odpowiedz

1

Jak stwierdzono w komentarzach, można użyć modułu async npm.

Alternatywnie, może wolisz callbacków gniazdem (ale może to prowadzić do tego, co jest znane jako wywołania zwrotnego piekła, a mianowicie wiele zagnieżdżonych funkcji zwrotnych) lub skorzystać z .Następnie mangusty() metoda - patrz http://mongoosejs.com/docs/promises.html

Tutaj może zrobić ..

EventModel.remove(args).then((removeResponse) => { 
    return EventModel.findOne(args); 
}).then((findResponse) => { 
    // etc 
}) 

Wnioski te będą realizowane synchronicznie.