蓝鸟承诺 - 不正确的履行顺序?

时间:2016-04-12 09:05:55

标签: javascript node.js promise bluebird

在我的expressJS应用程序中,我正在尝试使用thennable在序列中运行2异步承诺返回函数...

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一个接一个地执行"因为我用thennable链接了它们。连接前有一个日志语句,连接后有一个日志语句。如果一切顺利,我应该看到这样的日志......

  

连接到Redis缓存@localhost:6379 [确定]

     

同步到数据库... [确定]

     

Accounting Server已成功启动!

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

  

连接到Redis缓存@localhost:6379同步到数据库...   [确定]

     

Accounting Server启动成功!

     

[确定]

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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

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

connect2Redis(config.cache)
    .then(connect2db)