2

関数に次のものがあると仮定します。

exports.addnames = function(req, res) {
    var names = ["Kelley", "Amy", "Mark"];

    for(var i = 0; i < names.length; i++) {
        (function (name_now) {
            Person.findOne({ name: name_now},
                function(err, doc) {
                    if(!err && !doc) {
                        var personDoc = new PersonDoc();
                        personDoc.name = name_now;
                        console.log(personDoc.name);
                        personDoc.save(function(err) {});
                    } else if(!err) {
                        console.log("Person is in the system");
                    } else {
                        console.log("ERROR: " + err);
                    }
                }
            );   
        )(names[i]);
    }

私の問題は、名前を保存した後、結果を返したいということです:

Person.find({}, function(err, doc) {    
    res.json(200, doc);
})

名前のコールバックがありますが、すべての名前を保存するための呼び出しが完了する前に、コードの最後のブロック (Persons.find({})) が実行されるようです...したがって、ユーザーがブラウザ、「doc」は空です... for ループが完了した後に Persons.find({}) が確実に呼び出されるようにする方法はありますか?

4

1 に答える 1

1

このようなことを行う最も簡単な方法は、 https://github.com/caolan/asyncasyncにある適切な名前のような非同期ライブラリを使用することです。

保存したい名前のリストがあり、完了したら元に戻す場合は、次のようになります。

// save each of the names asynchronously
async.forEach(names, function(name, done) {
    Person.findOne({name: name},
        function(err, doc) {
            // return immediately if there was an error
            if(err) return done(err);

            // save the person if it doesn't already exist
            if(!doc) {
                var personDoc = new PersonDoc();
                personDoc.name = name;
                console.log(personDoc.name);

                // the async call is complete after the save completes
                return personDoc.save(done);
            } 

            // or if the name is already there, just return successfully
            console.log("Person is in the system");
            done();
        }
    );           
},
// this function is called after all of the names have been saved
// or as soon as an error occurs
function(err) {
    if(err) return console.log('ERROR: ' + err);

    Person.find({}, function(err, doc) {    
        res.json(200, doc);
    })

});
于 2012-09-25T22:17:18.963 に答える