如何将请求中的变量作为全局函数js的return值传递
How to pass a variable from a Request as the return value of the global function js
您好,提前谢谢您。我正在使用 npm tedious 包与数据库交互。我也在使用 Meteor.call 和方法,为此我需要传递一个变量(下面示例中的 newdata),该变量携带从数据库中获取的数据作为函数 return 的值 "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 不是任何函数的 return 值...
非常感谢。
你可以这样做:
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)));
});
}
Tedious 本身似乎不支持 promise,但您可以将函数包装在 promise 中:
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. I also found a tedious-specific promisifying package tedious-promises,但它似乎没有得到妥善维护。
您好,提前谢谢您。我正在使用 npm tedious 包与数据库交互。我也在使用 Meteor.call 和方法,为此我需要传递一个变量(下面示例中的 newdata),该变量携带从数据库中获取的数据作为函数 return 的值 "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 不是任何函数的 return 值...
非常感谢。
你可以这样做:
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)));
});
}
Tedious 本身似乎不支持 promise,但您可以将函数包装在 promise 中:
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. I also found a tedious-specific promisifying package tedious-promises,但它似乎没有得到妥善维护。