Node.js 与承诺混淆
我正在编写一个节点js代码来从azure SQL获取数据。在这里,我能够获取并正确打印它。但问题是我想在另一个地方打印。下面是我的代码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
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)
});