Notice: Undefined index: in /data/phpspider/phplib/misc.function.php on line 226
Node.js 与承诺混淆_Node.js - Fatal编程技术网

Node.js 与承诺混淆

Node.js 与承诺混淆,node.js,Node.js,我正在编写一个节点js代码来从azure SQL获取数据。在这里,我能够获取并正确打印它。但问题是我想在另一个地方打印。下面是我的代码 var Connection = require('tedious').Connection; var Request = require('tedious').Request; var tp = require('tedious-promises'); var x = []; // Create connection to database var conf

我正在编写一个节点js代码来从azure SQL获取数据。在这里,我能够获取并正确打印它。但问题是我想在另一个地方打印。下面是我的代码

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;
var tp = require('tedious-promises');

var x = [];
// Create connection to database
var config = {
    userName: 'myUserName',
    password: 'MyPwd',
    server: 'myServer',
    options: {
        database: 'myDB',
        encrypt: true
    }
}
tp.setConnectionConfig(config);

function queryDatabase() {
    console.log('Reading rows from the Table...');
    tp.sql("select TOP 10 title FROM dbo.Table").forEachRow(function(row) {
            x.push(row.title + "====");
        }).execute()
        .then(function(results) {
            console.log(x);   <======= It is printing here correctly.
        }).fail(function(err) {
            console.log(err);
        });
}

queryDatabase();
console.log("========");
console.log(x);<============ I want it to print the value here
但我的预期产出是

(node:15608) [DEP0064] DeprecationWarning: tls.createSecurePair() is deprecated. Please use tls.Socket instead.
[Here all the values are printed ]
========
[Here all the values are printed ]
请让我知道我哪里做错了,我该怎么做


谢谢,Promise是异步的,您必须在函数中使用回调或将函数转换为Promise:

回调版本:

function queryDatabase(callback) {
    var x = [];
    console.log('Reading rows from the Table...');
    tp.sql("select TOP 10 title FROM dbo.Table").forEachRow(function(row) {
            x.push(row.title + "====");
        }).execute()
        .then(function(results) {
            console.log(x);   <======= It is printing here correctly.
            return callback(null, x);
        }).fail(function(err) {
            console.log(err);
            return callback(err, null);
        });
}


queryDatabase(function(err, result){

    if(err){
        console.log(err);
    } else {
        console.log("========");
        console.log(x);<============ I want it to print the value here
    }

});
函数查询数据库(回调){
var x=[];
log('从表中读取行…');
tp.sql(“从dbo.Table中选择前10个标题”).forEachRow(函数(行){
x、 推送(row.title+“=”);
}).execute()
.然后(函数(结果){

console.log(x);让
queryDatabase()
返回由
tp.sql()
返回的承诺,并将
.then().catch()
块移动到您希望该值可用的位置。console.log(x);在从数据库获取结果并将其分配给x之前,正在执行第行。这就是它打印空结果的原因。使用异步等待承诺。或者在控制台记录x的地方编写逻辑。它已经是承诺函数。为什么还要在其上创建承诺函数?queryDatabase包含承诺,但函数它本身不是承诺。如果要在调用此函数时将其用作承诺,它必须返回承诺。否则,.then()和.catch()未在QueryDatabase上定义。他希望结果位于函数外部(而不是回调中)这是不可能的。@Vivekaaasaithambi,我不知道怎么做。但这段代码对我有效。你能提供一段性能更好的代码吗
function queryDatabase(callback) {
    var x = [];
    console.log('Reading rows from the Table...');
    tp.sql("select TOP 10 title FROM dbo.Table").forEachRow(function(row) {
            x.push(row.title + "====");
        }).execute()
        .then(function(results) {
            console.log(x);   <======= It is printing here correctly.
            return callback(null, x);
        }).fail(function(err) {
            console.log(err);
            return callback(err, null);
        });
}


queryDatabase(function(err, result){

    if(err){
        console.log(err);
    } else {
        console.log("========");
        console.log(x);<============ I want it to print the value here
    }

});
function queryDatabase() {

    return new Promise(function(resolve, reject){
        var x = [];
        console.log('Reading rows from the Table...');
        tp.sql("select TOP 10 title FROM dbo.Table").forEachRow(function(row) {
            x.push(row.title + "====");
        }).execute()
        .then(function(results) {
            console.log(x);   <======= It is printing here correctly.
            return resolve(x);
        }).fail(function(err) {
            console.log(err);
            return reject(err);
        });
    });
}


queryDatabase()
.then(function(result){

      console.log("========");
     console.log(result);<============ I want it to print the value here
})
.catch(function(err){

   console.log(err) 

});