2017-05-31 64 views
0

我如何调用一个then()函数?我是Bluebird的新手,之前我只是简单地触发回调来通知被调用的函数完成了它的工作。蓝鸟的函数然后

这是我的“主代码”,它将区域设置数据插入到我的Mongo和Redis数据库中。

var promise = Language.findOne({}).exec() 

promise.then(function(languages) { 
    /* If collection is empty initialize it */ 
    if(!languages) 
     return insertLanguagesIntoMongoDB() 
}) 
.then(function() { 
    /* Make sure it's cached in Redis */ 
    return insertLanguagesIntoRedis() 
}) 
.catch(function(err) { 
    throw err 
}) 

这是我的功能看起来像,但它说:“回调不是一个函数”:

function insertLanguagesIntoRedis(callback) { 
    logger.info("Inserting languages into redis db") 
    var promise = Language.find({}).exec() 
    promise.then(function(languages) { 
     if(!languages) 
      throw new Error("Couldn't find any languages in MongoDB's Language collection") 

     var languageJson = [] 
     for(var i=0; i<languages.length; i++) { 
      var object = {} 
      object.id = languages[i].iso_code 
      object.text = languages[i].name_en 
      languageJson.push(object) 
     } 
     redis.set('languages', JSON.stringify(languageJson)) 
     return callback() 
    }) 
    .catch(function (err) { 
     throw err 
    }) 
} 

那么我将如何正确定义和调用我的insertLanguagesIntoRedisinsertLanguagesIntoMongoDB功能?

+0

那么你是

promise.then(function(languages) { /* If collection is empty initialize it */ if(!languages) insertLanguagesIntoMongoDB() return languages }) .then(function(languages) { /* Make sure it's cached in Redis */ return insertLanguagesIntoRedis(languages) }) .catch(function(err) { throw err }) function insertLanguagesIntoRedis(languages) { logger.info("Inserting languages into redis db") var promise = Language.find({}).exec() return promise.then(function(languages) { if(!languages) throw new Error("Couldn't find any languages in MongoDB's Language collection") var languageJson = [] for(var i=0; i<languages.length; i++) { var object = {} object.id = languages[i].iso_code object.text = languages[i].name_en languageJson.push(object) } redis.set('languages', JSON.stringify(languageJson)) }) .catch(function (err) { throw err }) } 

更新在输入时不会将任何内容传递给insertLanguagesIntoRedis。 – akaphenom

+0

@akaphenom不幸的是,我对回调/蓝鸟很陌生,你能告诉我如何做到这一点正确的方式使用蓝鸟? – kentor

+1

在这种情况下,我不认为你需要通过,甚至拨打回叫。但我认为你应该看看承诺是如何工作的,以及如何将它们联系在一起。 – akaphenom

回答

1

这些方针的东西可能会奏效:

  1. 通过语言进入诺言链
  2. 在链的最后返回的承诺进入下一步
  3. 调整下一步接受语言
  4. 调整insertLanguagesIntoRedis接受语言
  5. 有insertLanguagesIntoRedis返回诺言链
  6. 从insertLanguagesIntoRedis删除回调调用

VAR承诺= Language.findOne({})。EXEC()每@Bergi

var promise = Language.findOne({}).exec() 

promise.then(function(languages) { 
    /* If collection is empty initialize it */ 
    if(!languages) 
     insertLanguagesIntoMongoDB() 
    return languages 
}) 
.then(function(languages) { 
    /* Make sure it's cached in Redis */ 
    return insertLanguagesIntoRedis(languages) 
}); 

function insertLanguagesIntoRedis(languages) { 
    logger.info("Inserting languages into redis db") 
    var promise = Language.find({}).exec() 
    return promise.then(function(languages) { 
     if(!languages) 
      throw new Error("Couldn't find any languages in MongoDB's Language collection") 

     var languageJson = [] 
     for(var i=0; i<languages.length; i++) { 
      var object = {} 
      object.id = languages[i].iso_code 
      object.text = languages[i].name_en 
      languageJson.push(object) 
     } 
     redis.set('languages', JSON.stringify(languageJson)) 
    }) 
} 
+1

你也可以放弃无用的'.catch(function(err){throw err})' – Bergi

+0

哦!我完全错过了... – akaphenom