异步调用的承诺和条件

最后发布: 2016-12-02 17:23:07


问题

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

对我来说,目前尚不清楚如何实现带有promise的以下方案:

  1. 我收到一个修改具有指定属性的实体的请求
  2. 我正在尝试在数据库中查找实体(异步调用find
  3. 如果找不到该实体,则创建一个具有初始状态的实体(异步调用createInitialStateObject
  4. 根据特定规则(异步调用applyModifications )修改实体(该实体在数据库中之前或之前在步骤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
    });
}

但是这里的缺陷在于,创建可能发生在修改之前,而不一定要接连发生。

另一个尝试可行,但看起来有点奇怪。 我创建了一个空的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
    });
}

应该如何正确实施它?

node.js asynchronous promise es6-promise
回答

创建“空”或同步。 承诺并不罕见。 甚至有一个简短的方法: 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
}