您好,并提前感谢您。我正在使用npm繁琐的包与数据库进行交互。我也在使用Meteor.call和方法,我需要传递一个变量(下例中的newdata),它携带从数据库中获取的数据作为函数“rr”的返回值,这样我就可以了能够通过Meteor调用在客户端中使用该函数的结果。
function rr(){
var newdata = [];
var ahora = new Request("SELECT * FROM prueba", function (err) {
if (err) {
console.log("err1");
} else {
}
})
ahora.on('row', function(columns) {
columns.forEach(function(column) {
newdata.push(column.value);
});
});
}
我希望“newdata”成为rr函数的结果。我怎样才能做到这一点?如果我写“return newdata”它是未定义的,我不能使用await,因为newdata不是任何函数的返回值......
非常感谢。
答案 0 :(得分:1)
你可以这样做:
function rr(){
return await new Promise((resolve, reject) => {
new Request("SELECT * FROM prueba", (err, rowCount) => {err && reject(err);})
.on('row', columns => resolve(columns.map(c => c.value)));
});
}
答案 1 :(得分:1)
Tedious似乎本身并不支持promises,但你可以将你的函数包装在一个承诺中:
function rr() {
return new Promise((resolve, reject) => {
var ahora = new Request("SELECT * FROM prueba", function (err) {
if (err) {
reject(err);
}
});
var newdata = [];
ahora.on('row', function(columns) {
columns.forEach(function(column) {
newdata.push(column.value);
});
});
resolve(newdata);
}
}
或略短:
function rr() {
return new Promise((resolve, reject) => {
new Request("SELECT * FROM prueba")
.on("error", reject)
.on("row", function(columns) {
resolve(columns.map(column => column.value))
});
}
}
如果您不想手动承诺,可以尝试Bluebird的promisify function。我还找到了一个单调乏味的宣传包tedious-promises,但它似乎没有得到妥善维护。