繁体   English   中英

连锁承诺

[英]Chaining a 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})
      })
  };

我被卡住了。 我该如何进行?

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

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

并且insertOrUpdateBuilding应该保证insertOrUpdateBuilding调用insertOrUpdateBuilding

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

请注意,在较低级别的函数中catch错误通常没有任何意义(除了记录/调试目的)。 让错误传播到更高级别,您可以在其中以明智的方式进行处理,例如通知用户。

尝试使用ES7异步/等待。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM