在我的expressJS应用程序中,我尝试使用thennable按顺序运行2个异步promise返回函数。

connect2Redis(config.cache)
.then(connect2db())
.then(function() {
    console.log("Accounting Server started successfully!");
  })
})
.catch(function(e){
  console.error("Failed to start Accounting server. Error: ", e);
})


两个fns'connect2Redis'和'connect2db'的实现如下:

function connect2Redis(opts) {
  var connectingMsg = "Connecting to Redis Cache @" + config.cache.host + ":" +config.cache.port;
  process.stdout.write(connectingMsg);
  return new Promise(function(resolve, reject){
    var redisClient = redis.createClient(opts);
    redisClient.on('ready', function(){
      console.log("  [ " + "OK".green + " ]");
      return resolve(redisClient);
    })
    redisClient.on('error', function(e){
      console.log("[" + "FAIL".red + "]");
      return reject(e);
    })
  });
}


function connect2db() {
  process.stdout.write("Synchronizing to database...");
  return DB.sequelize.sync().then(function() {
    console.log("  [ " + "OK".green + " ]");
  }).catch(function(e) {
    console.log("[" + "FAIL".red + "]");
    return e;
  });
}


我希望这两个fns可以“一个接一个”执行,因为我已使用thenable将它们链接在一起。有两个日志语句,一个在连接之前,一个在连接之后。如果一切顺利,我应该会看到这样的日志...


  连接到Redis缓存@localhost:6379 [确定]
  
  同步到数据库... [确定]
  
  计费服务器启动成功!


但是显示混乱了,我看到了类似的东西。


  正在连接到Redis缓存@localhost:6379正在同步到数据库...
  [ 好 ]
  
  计费服务器启动成功!
  
  [ 好 ]


我期望conenct2Redis fn中的日志语句应该被打印而不会被connect2db的日志打断,因为第二个fn是在connect2Redis完成后调用的,使用then(...)

我在这里缺少什么吗?

最佳答案

您需要传递对该函数的引用,而不是调用该函数

connect2Redis(config.cache)
    .then(connect2db)

10-02 11:50