我是NodeJS的新手,花了几个小时试图了解Promise的确切运作方式,看似简单的事情仍然无效。
我试图对数据库进行一些调用,一旦完成所有这些调用,就做其他事情。我现在拥有的是以下代码,但没有调用那些函数。
var queries = ['SELECT value FROM tag', 'SELECT url FROM download_link'];
console.log("Starting promises");
var allPromise = Promise.all([queryDatabaseAddToResult(connection, queries[0], result), queryDatabaseAddToResult(connection, queries[1], result)]);
allPromise.then(
function(result) {
console.log("1"); // Does not show up
}, function(err) {
console.log("2"); // Does not show up either
}
);
function queryDatabaseAddToResult(connection, query, result) {
return new Promise(function(resolve, reject) {
connection.query(query, function(err, rows, fields) {
if (err) {
console.log(err);
Promise.reject(err);
}
console.log(rows);
result.tags = JSON.stringify(rows);
Promise.resolve(result);
});
})
}
对数据库的调用确实已经完成,因为记录行显示在日志中。
答案 0 :(得分:8)
问题是您没有调用正确的resolve
和reject
函数。它应该是:
function queryDatabaseAddToResult(connection, query, result) {
return new Promise(function(resolve, reject) {
connection.query(query, function(err, rows, fields) {
if (err) {
console.log(err);
reject(err);
} else {
console.log(rows);
result.tags = JSON.stringify(rows);
resolve(result);
}
});
})
请注意,resolve
和reject
来电应不作为Promise.
的范围。您应该使用else
来避免在您调用resolve
后致电reject
。
答案 1 :(得分:0)
你必须这样做:
var promise1 = queryDatabaseAddToResult(connection, queries[0], result);
var promise2 = queryDatabaseAddToResult(connection, queries[1],result);
Promise.all([prromise1, promise2]).then(result => {
console.log(1);
}).catch(err => {
console.log(err);
});
答案 2 :(得分:0)
return Promise.reject() //no need to add else part