我遇到了异步功能问题。我正在使用mongodb进行查询(使用mongoose),当我尝试获取信息时,它会产生undefined。
这是我对db的查询(嵌套在函数中):
function kquery() {
Krakentick.findOne(
{
iname: 'btcusd',
n: { $lt: now }
},
'mk c n',
function(err, tick) {
if (err) {
return console.log(err);
} else {
return tick;
}
}
);
}
这是我的异步/等待函数:
async function compare() {
var ktick = await kquery();
console.log(ktick);
}
compare();
这些函数都在同一个文件中,当我运行它时它会给我一个'undefined'
。
然而,当我只运行查询功能并提出console.log(tick)
而不是return tick
时,我会得到正确的信息:
{ _id: 59d1199cdbbcd32a151dcf21,
mk: 'kraken',
c: 430900,
n: 1506875804217 }
我想,我搞砸了某个地方的回调,但我不确定在哪里或如何。 这是完整的文件:
const mongo = require('mongodb');
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const server = mongoose.connect('mongodb://localhost/cryptoCollection', {
useMongoClient: true
});
//Loading the mongoose schema:
const { Krakentick } = require('./kraken/model/krakenModel');
var now = Math.floor(new Date());
function kquery() {
Krakentick.findOne(
{
iname: 'btcusd',
n: { $lt: now }
},
'mk c n',
function(err, tick) {
if (err) {
return console.log(err);
} else {
return tick;
}
}
);
}
async function compare() {
var ktick = await kquery();
console.log(ktick);
}
compare();
提前感谢您的帮助!
答案 0 :(得分:3)
您的kquery
函数必须返回承诺:
function kquery() {
return Krakentick.findOne(
{
iname: 'btcusd',
n: { $lt: now }
},
'mk c n',
function(err, tick) {
if (err) {
return console.log(err);
} else {
return tick;
}
}
);
}
答案 1 :(得分:0)
只需发布promesified kquery函数以供参考:
function kquery() {
return new Promise((resolve, reject) => {
Krakentick.findOne(
{
iname: 'btcusd',
n: { $lt: now }
},
'mk c n',
function(err, tick) {
if (err) {
reject(err);
} else {
resolve(tick);
}
}
);
});
}
接受的答案是上面的答案,尽管Mörre的评论中已经讨论过并记录过这些答案!我只是想把它留在那里以防它帮助别人!
再次感谢您的宝贵帮助!