当前位置: 首页 > 面试题库 >

嵌套的Promise不会在Node.js中向父Promise传播错误吗?

乜清野
2023-03-14
问题内容

我正在使用运行Express的Node.js/TypeScript创建API。以下是我的get方法的摘录。在format方法中触发了一个错误,该错误引发了由诺言捕获的错误,但在引发后不会传播到父诺言:

            this.getModel(objectName).findAll(queryParameters).then(function(databaseObjects) {
                for (let databaseObject of databaseObjects) {
                    var jsonObject = {};
                    //console.log("Database object: ");
                    //console.log(databaseObject);
                    transform.baseFormat(databaseObject, jsonObject)
                    .then(() => transform.format(databaseObject, jsonObject))
                    .then(() => {
                        res.locals.retval.addData(jsonObject);
                    }).catch((e) => {
                        console.log("Caught error during format of existing object: ");
                        console.log(e);
                        throw e;
                    });
                }
            })
            .then(() => {
                if (metadata) {
                    this.metadata(objectName, false, transform, res.locals.retval);

                    delete queryParameters.limit;
                    delete queryParameters.offset;
                    console.log("RUNNING METADATA COUNT: ");
                    this.getModel(objectName).count(queryParameters).then(function(count) {
                        res.locals.retval.setMetadata("records", count);
                        return next();
                    }).catch(function(e) {
                        this.error(e, res);
                        return next();
                    });
                } else {
                    console.log("NO METADATA");
                    return next();
                }
            })
            .catch((e) => {
                // TODO: Move status into error() function
                console.log("500 Error on GET");
                console.error(e);
                res.locals.retval.addError(ErrorCode.InternalError, e);
                res.status(ErrorCode.InternalError).send(res.locals.retval);
                return next();
            });

这是输出:

(node:8277) Warning: a promise was created in a handler at /Library/WebServer/adstudio/dist/server.js:555:51 but was not returned from it, see
at Function.Promise.bind (/Library/WebServer/adstudio/node_modules/bluebird/js/release/bind.js:65:20)
Caught error during format of existing object: 
Test Error
END FUNCTION HAS BEEN REACHED!

然后,请求无法完成。

我已经阅读了很多关于Promises的文章,但找不到与我类似的问题/解决方案。

  • http://bluebirdjs.com/docs/warning-explanations.html
  • http://taoofcode.net/promise-anti-patterns/
  • https://www.reddit.com/r/javascript/comments/4bj6sm/am_i_wrong_to_be_annoyed_with_promise_error/
  • https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
  • http://wiki.commonjs.org/wiki/Promises/A
  • https://promisesaplus.com/

问题答案:

在该for循环中运行不是异步的,因此您的诺言基本上是在循环完成后立即解决,但尚未完成所有格式化。

使用一个promise控制流,例如bluebird的Promise.each,它是serial或just
Promise.all。然后将捕获任何异常。

this.getModel(objectName).findAll(queryParameters).then(function (databaseObjects) {
  var promises = databaseObjects.map(databaseObject => {
    var jsonObject = {}
          // console.log("Database object: ");
          // console.log(databaseObject);
    return transform.baseFormat(databaseObject, jsonObject)
          .then(() => transform.format(databaseObject, jsonObject))
          .then(() => {
            res.locals.retval.addData(jsonObject)
          }).catch((e) => {
            console.log('Caught error during format of existing object: ')
            console.log(e)
            throw e
          })
  })
  return Promise.all(promises)
})
.catch((e) => {
    // TODO: Move status into error() function
  console.log('500 Error on GET')
  console.error(e)
  res.locals.retval.addError(ErrorCode.InternalError, e)
  res.status(ErrorCode.InternalError).send(res.locals.retval)
  return next()
})


 类似资料:
  • 我不熟悉promise和使用NodeJS中的请求和promise编写网络代码。 我想删除这些嵌套的promise,并将它们链接起来,但我不确定该如何做/这是否是正确的方式。 这是请求代码: 如有任何见解,将不胜感激。

  • 问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相

  • 我有一个复杂的对象图,我建立在一个Ember控制器。 所以,为了安排这一切,我基本上是想 创建conatainer, 然后,创建细节,其中可能有许多 然后,创建项目,其中会有尽可能多的细节 等待一切promise解决 启动一个自定义的Rest动作来“激活”容器,一旦它有了所有的东西。 代码看起来像这样(咖啡),简化了但我认为要点就在那里 当所有的promise都解决了,一切都是我想要的,然而,al

  • 问题内容: 我是一个node.js新手,我试图了解如何以非阻塞方式像节点一样组织一些逻辑。 我有一组环境[‘stage’,’prod’],还有另一组称为品牌[‘A’,’B’,’C’]的参数和一组设备[‘phone’,’tablet’] 。 在节点的回调驱动的世界中,我有这个: 我正在尝试为每个环境构建带有块的报告: 我的问题是,由于这里的所有内容都是如此异步的,尤其是在getTape内部,它调用了

  • 我遇到了一个问题,我的程序只在的一次迭代中结束,我不确定不合逻辑的代码在哪里。 全球给予: 我复杂的嵌套从这里开始,但我不确定如何修复它,以便它迭代通过和数字for-循环: 我得到以下输出: 我从来没有得到Susie的数据,我很早就回来了,但似乎不知道在哪里。对于问题所在(甚至重构)的任何帮助/指导都将不胜感激。提前谢谢!

  • 我正在努力返回嵌套在函数中的一个promise(或多个promise),该函数嵌套在函数中。 我认为最好通过查看代码来缠绕你的头,所以这里是: