我是node.js的新手,我以为我开始理解异步函数,但是这段代码让我认为我还是不能正确理解它。
我正准备使用mongoose插入mongoDB,并且要插入的对象是post。令我惊讶的是,在插入之前并不总是设置post.kunde
或post.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);
});
});
});
}
答案 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传递给我的回调函数,并做任何你想做的事情。
编辑:
确保你总是从你的承诺中返回一些内容,据我所知,异步调用永远不会解决,因为它永远不会收到任何东西。虽然有人可能有一个例子,但事实并非如此。