NodeJS承诺 - "然后"不叫

时间:2016-08-27 11:04:54

标签: node.js

我是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);
   });  
})

}

对数据库的调用确实已经完成,因为记录行显示在日志中。

3 个答案:

答案 0 :(得分:8)

问题是您没有调用正确的resolvereject函数。它应该是:

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);
      }
   });  
})

请注意,resolvereject来电应作为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
相关问题