如何从Request传递变量作为全局函数js的返回值

时间:2018-01-13 17:30:58

标签: javascript node.js meteor tedious

您好,并提前感谢您。我正在使用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不是任何函数的返回值......

非常感谢。

2 个答案:

答案 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,但它似乎没有得到妥善维护。