在结束AJAX请求之前等待node.js回调完成

时间:2013-09-20 20:14:40

标签: ajax node.js jquery express

我在前面使用jQuery使用$ .post()发出AJAX帖子请求。我还传递了一个成功函数,它将对返回的数据执行某些操作。在我的node.js服务器上,我使用express来处理请求,post请求调用另一个函数传递一个回调,在回调中执行res.send()。在回调完成之前,如何才能完成请求?

我的客户端代码是:

$.post("/newgroup/", {name: newgroupname}, function(data) {
    console.log(data); // Returns undefined because requests ends before res.send
});

我的服务器端代码是:

app.post('/newgroup/', function(req, res){
    insertDocument({name:req.body.name, photos:[]}, db.groups, function(doc){
        res.send(doc); 
    });
});

insertDocument函数是:

function insertDocument(doc, targetCollection, callback) {
    var cursor = targetCollection.find( {}, {_id: 1}).sort({_id: -1}).limit(1);
    cursor.toArray(function(err, docs){
        if (docs == false){
            var seq = 1;
        }
        else {
            var seq = docs[0]._id + 1;
        }
        doc._id = seq;

        targetCollection.insert(doc);
        callback(doc);
    });
}

3 个答案:

答案 0 :(得分:1)

如果您向我们展示的代码是真实代码,则唯一的可能性是您返回的内容doc实际上是undefined。 <{1}}触发前,客户端上的回调不会触发。

您确定res.send()中的回调完全符合您的想法吗?通常回调的形式为insertDocument,即试试这个:

function(err,doc)

答案 1 :(得分:0)

好的,我找到了答案,我不知道为什么会这样,我只需要更改我发送给回调的变量的名称,我认为这是因为它与参数具有相同的名称,所以我我的insertDocument函数改为看起来像这样

function insertDocument(doc, targetCollection, callback) {
    var cursor = targetCollection.find( {}, {_id: 1}).sort({_id: -1}).limit(1);
    cursor.toArray(function(err, docs){
        if (docs == false){
            var seq = 1;
        }
        else {
            var seq = docs[0]._id + 1;
        }
        doc._id = seq;

        targetCollection.insert(doc);
        var new_document = doc;
        callback(new_document);
     });
}

答案 2 :(得分:0)

可能是同步/异步问题吗?我不知道你用的是什么库用于你的保存,但是这个电话应该更像这样吗?

targetCollection.insert(doc, function(err, saveddoc) {
    if (err) console.log(err);
    callback(saveddoc);
});