【问题标题】:code sequence in nodejsnodejs中的代码序列
【发布时间】:2016-06-24 19:31:22
【问题描述】:

我是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); 
            });               
        });
    });
}

【问题讨论】:

  • 你想做什么?在我看来,您正在尝试查找和编辑。对吗?

标签: node.js mongodb asynchronous mongoose


【解决方案1】:

所以这里有一些问题。承诺基本上是在说“嘿,我的事情还没做完,但我会保证等我弄清楚我需要做的所有事情后,把它交给你。”

我不完全确定你是如何调用它的,但可以把它想象成一个大的回调函数。所以在这之后你会有类似的东西,

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

我看到的真正问题是你只解决了一个承诺。我不是 100% 确定你是否必须解决 Mongo 承诺,除非你使用 bluebird 承诺。但你的第一个承诺永远不会得到回报。

我会重做你的代码,我认为这应该可以:

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 传递到我的回调函数中,并用它做任何你想做的事情。

编辑:

确保你总是从你的承诺中返回一些东西,据我所知,异步调用永远不会解决,因为它永远不会收到任何东西。尽管有人可能举了一个不正确的例子。

【讨论】:

  • 谢谢你 Morgan G。我听从了你的建议,这是有道理的,但是 if 语句在承诺返回之前没有设置 post.kunde:resolve(post)。
  • 你是在传递一个带有键的对象,而不是一个数组给客户吗?我想你只是确保。
  • 是的 - 我正在使用密钥传递客户对象。就目前而言,我将承诺放入 async.series 中,其中每个 if - 语句都在其自己的函数中。但我的问题是我还是不明白。 if 语句是异步的吗?
  • 啊,是的,所以节点中的所有内容都是非阻塞的!所以 if 语句的处理速度可能不够快。你可以做的一件事是让它看起来更好一点,就是将 Promise 与 Promise.then() 连接在一起。或者,您可以使用任何您认为更清洁的解决方案来嵌套 promise。
  • 我刚刚在promise之前的代码中发现了一个代码错误,延迟了客户对象。现在它正在工作,我可以再次将 async.series 从 if 语句中取出。无论如何,您的回答使我以更好的方式组织了我的代码。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2014-11-01
相关资源
最近更新 更多