Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 异步调用的承诺和条件_Node.js_Asynchronous_Promise_Es6 Promise - Fatal编程技术网

Node.js 异步调用的承诺和条件

Node.js 异步调用的承诺和条件,node.js,asynchronous,promise,es6-promise,Node.js,Asynchronous,Promise,Es6 Promise,我正在使用Node.js和AWS DynamoDB(AWS sdk)实现我的服务 我不清楚如何通过承诺实现以下场景: 我收到一个修改具有指定属性的实体的请求 我试图在数据库中查找实体(异步调用find) 如果找不到实体,则创建一个初始状态的实体(异步调用createInitialStateObject) 根据特定规则(异步调用applyModifications)修改实体(在步骤3之前或刚刚创建的数据库中) 这是我第一次尝试: function scenario(params) { fi

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

我不清楚如何通过承诺实现以下场景:

  • 我收到一个修改具有指定属性的实体的请求
  • 我试图在数据库中查找实体(异步调用
    find
  • 如果找不到实体,则创建一个初始状态的实体(异步调用
    createInitialStateObject
  • 根据特定规则(异步调用
    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
        });
    }
    

    如何以正确的方式实现它?

    创建“空”或同步。承诺并不罕见。实现这一点的方法甚至很短:
    Promise.resolve(value)
    立即创建并解析承诺

    除此之外,你应该利用适当的链接和停止嵌套的东西这么多。一旦你进入了一个链,你甚至不需要解析一个空的承诺,因为一个非thenable对象的返回值被解释为正是这样

    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
    }
    

    不可编辑对象的返回值
    相当于返回
    Promise.resolve(值)-因为根据
    。那么
    必须返回承诺