【问题标题】:Promises and condition from async call来自异步调用的承诺和条件
【发布时间】:2017-04-17 16:35:53
【问题描述】:

我正在使用 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
    });
}

应该如何以正确的方式实施?

【问题讨论】:

    标签: node.js asynchronous promise es6-promise


    【解决方案1】:

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

    此外,您应该使用适当的链接并停止嵌套太多东西。一旦你在一个链中,你甚至不需要解析一个空的 Promise,因为一个非 thenable 对象的返回值被解释为正是 this。

    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
    }
    

    【讨论】:

    • a return value of a non thenable object 相当于 return Promise.resolve(value); - 因为根据 spec .then 必须返回一个 Promise
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2016-09-03
    • 1970-01-01
    • 2018-07-01
    • 2020-06-10
    相关资源
    最近更新 更多