链接承诺

时间:2016-11-17 10:08:00

标签: javascript asynchronous promise

我检查表中是否存在帖子。如果没有,我插入它。所以我需要进行两次异步调用。我可以用承诺做到这一点吗?

var insertOrUpdateBuilding = (callback)=>{
    // Check if building exists
    db('buildings')
      .where({externalId: buildingId})
      .then(function(rows){
        // Building exist, do nothing
        if(rows){
          callback ();
        }
        // Building does not exist. Insert it
        if(!rows){
          return db('buildings').insert({externalId: buildingId, name: req.body.name})
        }
      })
      .then(function(promise){

      })
      .catch(function(err){
        callback({message: 'Error looking up building', err: err})
      })
  };

我被困住了。我该怎么办?

2 个答案:

答案 0 :(得分:3)

承诺是粘性的,一旦你开始使用它们,每个涉及的功能都必须接受并返回承诺。在您的示例中,如果承诺db(),那么insertOrUpdateBuilding也应该返回一个承诺,即db(...)附加了一些then

var insertOrUpdateBuilding = () => db('buildings')
    .where({externalId: buildingId})
    .then(rows => rows ||
        db('buildings').insert({externalId: buildingId, name: req.body.name}))
    ;

和任何打电话给insertOrUpdateBuilding的人都应该得到承诺:

  insertOrUpdateBuilding().then(okay).catch(error!)

请注意,它通常对较低级别函数中的catch错误没有意义(除了记录/调试目的)。让误差传播到上层,你可以以合理的方式处理它,例如告知用户。

答案 1 :(得分:0)

尝试使用ES7 async / await。

var async insertOrUpdateBuilding = (callback) => {
    try {
        // Check if building exists
        let rows = await db('buildings')
          .where({externalId: buildingId});
        // Building exist, do nothing
        if (rows){
          callback();
        }
        // Building does not exist. Insert it
        if (!rows) {
          let row = await db('buildings').insert({
            externalId: buildingId, 
            name: req.body.name
          });
          callback();
        }
    } catch (e) {
        callback({message: 'Error looking up building', err: e});
    }
};