nodejs中的代码序列

时间:2016-03-10 05:26:46

标签: node.js mongodb asynchronous mongoose

我是node.js的新手,我以为我开始理解异步函数,但是这段代码让我认为我还是不能正确理解它。

我正准备使用mongoose插入mongoDB,并且要插入的对象是post。令我惊讶的是,在插入之前并不总是设置post.kundepost.leverandor

我认为只要没有异步函数,代码就应该逐行执行。

function create_post(account, dato, fakturanummer, bilag, bilagstype, supplier, customer, 
    descr, moms, amount, saldo, comId  ) {
    return new Promise(function(resolve, reject) {
        var post = new Posteringer;
        post.konto = account;
        post.dato = dato;
        post.fakturanummer = fakturanummer;
        post.bilag = bilag;
        post.bilagstype = bilagstype;
        if (Object.keys(supplier).length) {
            post.leverandor = supplier;
        }
        if (Object.keys(customer).length) {
            post.kunde = customer;
        }    
        post.tekst = descr;
        post.moms = moms;
        post.belob = amount;
        post.saldo = saldo;
        post.companyId = comId;    
        var promise = Accounts.findSingle(comId, account).exec(); 
        promise.then(function(acc) {
            post.navn = acc.Navn;
            console.log(post);
            post.save(function(err) {
                    if (err) {console.log(err.message);}
                    resolve(true); 
            });               
        });
    });
}

1 个答案:

答案 0 :(得分:0)

所以这里有一些问题。承诺基本上是在说“嘿,我还没有完成我的工作,但是当我弄清楚我需要做的所有事情时,我会保证能得到这个。”

我不完全确定你是怎么称呼它的,但是把它想象成一个很大的回调函数。所以在此之后你会有类似的东西,

create_post(......).then(
                         function(post){ 
                              post.save(function(err){
                                    if (err) {console.log(err.message);}
                                 });
                         });

我看到的真正问题是你只是在解决一个承诺。我不是百分百肯定你是否必须解决Mongo的承诺,除非你使用蓝鸟承诺。你的第一个承诺永远不会归还。

我会重做你的代码,我认为这应该有效:

function create_post(account, dato, fakturanummer, bilag, bilagstype, supplier, customer, 
    descr, moms, amount, saldo, comId  ) {
    return new Promise(function(resolve, reject) {
        var post = new Posteringer;
        post.konto = account;
        post.dato = dato;
        post.fakturanummer = fakturanummer;
        post.bilag = bilag;
        post.bilagstype = bilagstype;
        if (Object.keys(supplier).length) {
            post.leverandor = supplier;
        }
        if (Object.keys(customer).length) {
            post.kunde = customer;
        }    
        post.tekst = descr;
        post.moms = moms;
        post.belob = amount;
        post.saldo = saldo;
        post.companyId = comId;    
        var promise = Accounts.findSingle(comId, account).exec(); 
        promise.then(function(acc) {
            post.navn = acc.Navn;
            console.log(post);              
        });
        return (err ? reject(err) : resolve(post));

    });
}

然后当你调用这个函数时,就像在我的第一个例子中一样调用它!

create_post(......).then(
                         function(post){ 
                              post.save(function(err){
                                    if (err) {console.log(err.message);}
                                 });
                         });

字面上你所说的是如果这个结果并且我得到我的数据没有任何错误,请发回帖子。然后将post传递给我的回调函数,并做任何你想做的事情。

编辑:

确保你总是从你的承诺中返回一些内容,据我所知,异步调用永远不会解决,因为它永远不会收到任何东西。虽然有人可能有一个例子,但事实并非如此。