来自异步调用的承诺和条件

时间:2016-12-02 17:23:08

标签: node.js asynchronous promise es6-promise

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

我不清楚如何使用promises实现以下场景:

  1. 我收到修改具有指定属性的实体的请求
  2. 我试图在数据库中找到实体(异步调用find
  3. 如果找不到实体,则创建一个具有初始状态的实体(异步调用createInitialStateObject
  4. 根据特定规则(异步调用applyModifications)修改实体(位于数据库之前或刚刚在步骤3中创建)
  5. 这是我的第一次尝试:

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

    但这里的缺陷是创造可能在修改之前发生,它不会一个接一个地发生。

    另一种尝试有效,但看起来有点奇怪。我创建了一个空的promise,以便在对象已经存在的情况下调用:

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

    如何以正确的方式实施?

1 个答案:

答案 0 :(得分:2)

创建'空'或同步。承诺并非不寻常。甚至还有一个简短的方法:Promise.resolve(value)立即创建并解决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
}