异步调用的承诺和条件

Promises and condition from async call

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

我不清楚如何使用 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
    });
}

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

另一个尝试成功了,但看起来有点奇怪。我创建了一个空的承诺,以防对象已经存在:

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

应该如何正确实施?

正在创建 'empty' 或同步。承诺并不罕见。甚至有一个简短的方法可以做到这一点:Promise.resolve(value) 立即创建并解析一个 Promise。

除此之外,您应该使用适当的链接并停止嵌套太多东西。一旦你在一个链中,你甚至不需要解决一个空的承诺,因为一个非 thenable 对象的 return 值被解释为这个。

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
}