PG承诺:链接条件查询

时间:2019-09-17 03:55:55

标签: javascript express bluebird pg-promise

我正在尝试找到链接条件查询的正确方法。

以下是一些伪代码来说明我的情况:

check whether the an item exists;
  if no:
    reply with status 404;
  if yes:
    check whether the user owns the item;
      if no:
        redirect to another page;
      if yes:
        retrieve the information about the item and render the page;

我的第一个直觉是使用tasks来重用相同的连接,但是由于可能的结果不同,我很难弄清楚如何正确处理承诺:

db.task(t => {
  return t.items.exists(itemId)
    .then(exists => {
      if (!exists) { // item does not exist
        // 404
      }

      return t.items.isOwner(itemId, userId)
        .then(isOwner => {
          if (!isOwner) {
            // redirect to some other page
          }

          return t.items.getById(itemId);
        })
    })
})
.then(data => {
  // OK, process data and render
})
.catch(console.error); // unexpected errors

例如,如果我尝试重定向到404页面,此后的诺言仍将得到解决。 另一种方法是具有以下条件:

if (!exists) { // item does not exist
  return Promise.reject('404');
}

...

.then(data => {
  // OK, process data and render
}, reason => {
  // KO, conditions were not met to resolve
})

“有效”,但同时捕获错误和未满足的条件。我希望有一个专门的“未满足条件”处理程序。

还有我想到的另一种方法:

var p = db.task(t => {
  return t.items.exists(itemId)
    .then(exists => {
      if (!exists) { // item does not exist
        //  resolve p (and break promise chain) with something like
        //  p.resolve(() => {
        //    return res.redirect...
        //  });
      }

      // else we can go on with the queries
      return t.items.isOwner(itemId, userId);
    }
    .then(isOwner => {
      if (!isOwner) {
        // resolve p and redirect to some other page
      }

      return t.items.getById(itemId);
    })
    .then(item => {
      // everything OK, resolve with a handler to render the page
    });
})
.then(action => {
  action();
})
.catch(console.error); // unexpected errors

但是我看不出有什么方法可以解决p。在嵌套承诺中调用Promise.resolve(...)会解决下一个承诺本身,然后才陷入p的{​​{1}}。

链接条件查询并处理then中不同结果同时关注性能的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

看看这是否适合您。

这仍然需要物品落入每个承诺中,直到到达最后一个CompletableFuture.supplyAsync(() -> { // do smth }, threadPool) 块或then块为止。

catch

答案 1 :(得分:1)

作者遇到的问题主要与使用诺言有关,而与pg-promise无关。

db.task('easy-peasy', async t => {
    if (await t.items.exists(itemId)) {
        // reply with status 404;
    } else {
        if (await t.items.isOwner(itemId, userId)) {
            // redirect to some other page
        } else {
            return t.items.getById(itemId); // return the data
        }
    }
})
    .then(data => {
        if (data) {
            // Task returned data;
            // Render the data;
        }
    })
    .catch(console.error); // unexpected errors