从asynchronous调用的承诺和条件

我正在使用AWS DynamoDB( aws-sdk )的Node.js实现我的服务。

我不清楚如何实现以下承诺的情况:

  1. 我得到一个请求来修改具有指定属性的实体
  2. 我试图find数据库中的实体(asynchronous调用find
  3. 如果实体没有find,那么创build一个初始状态(asynchronous调用createInitialStateObject
  4. 根据特定规则(asynchronous调用applyModifications )修改实体(位于数据库之前或刚创build的第3步)

这是我第一次尝试:

 function scenario(params) { find(params).then((data) => { let objectExists = checkExistense(data); if (!objectExists) { createInitialStateObject(params).then((data) => { console.log("Object created"); // OK }).catch((err) => { console.error("Object not created"); // exit and return error }); } applyModifications(params).then((data) => { // OK, return data }).catch((err) => { // exit and return error }); }).catch((err) => { // exit and return error }); } 

但是这里的缺陷是创作可能在修改之前发生,不一定会发生一个又一个。

另一个尝试的作品,但看起来有点奇怪。 我创build一个空的承诺,以防万一对象已经存在:

 function scenario(params) { find(params).then((data) => { let conditionalPromise = new Promise((resolve) => { resolve(null); }); let objectExists = checkExistense(data); if (!objectExists) { conditionalPromise = createInitialStateObject(params); } conditionalPromise.then((data) => { applyModifications(params).then((data) => { // OK, return data }).catch((err) => { // exit and return error }); }).catch((err) => { // exit and return error }); }).catch((err) => { // exit and return error }); } 

如何以正确的方式实施?

创build“空”或同步。 承诺并不罕见。 甚至还有一个很简单的方法: Promise.resolve(value)立即创build并解决Promise。

除此之外,你应该利用适当的链接,并且不要太多的嵌套。 一旦你在一个链中,你甚至不需要解决一个空的承诺,因为非可定义对象的返回值被解释为这个。

 function scenario(params) { return find(params) .then(data => { let objectExists = checkExistense(data); if (!objectExists) { return createInitialStateObject(params); } // if we return nothing (or null in your case) this will be the same as return Promise.resolve() return null; }) .then(data => applyModifications(params)) .then(data => console.log(data)) .catch(err => console.log(err)); // exit and return error }