【问题标题】:Unable to handle promise failure inside other promise无法处理其他承诺中的承诺失败
【发布时间】:2017-12-27 12:04:54
【问题描述】:

我正在尝试使用 2 个 Promise,第二个 Promise 取决于第一个 Promise。一个 3 承诺取决于两个承诺。但是当第一个承诺失败时,我在第二个承诺中得到这个错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:2):TypeError:无法读取 null 的属性“名称”

这是我的代码:

var Asset  = require('../models/index').Asset;
var Price = require('../models/index').Price;

var currency = req.params.currency;

var values = { 
                where: { slugify_url: currency },                    
            };

// get asset information 
var promisse_asset = Asset.findOne(values); 


// get prices information on this asset
var promisse_prices = promisse_asset.then(function(asset) {

    console.log(asset); // outputs null
    // some processing
    if (!!asset) {
        ...  


});


return Promise.all([promisse_asset, promisse_prices]).then(function([asset, results]) {
    ...

我该如何解决这个问题?当我在我的数据库中找不到资产时,我该如何处理?

【问题讨论】:

  • 您似乎只是缺少catch(或第二个then 参数)。没有它,您会收到 “未处理的承诺拒绝” 错误
  • @Phil 我在第一个承诺之后放了一个 catch,但它似乎没有进入 catch 条件。我该怎么做?
  • 啊,所以第一个 Promise 解析成功,只是带有 null 值。在这种情况下,您应该抛出一个错误以导致 promise 失败。那个人需要被Promise.all 承诺
  • @Phil 谢谢!我将捕获添加到第三个承诺中并且它起作用了。

标签: javascript promise


【解决方案1】:

有一种情况,您希望通过Promise.all 批量处理承诺并获得所有结果包括被拒绝的here(最后一个代码块)解释了如何做到这一点。

有一种情况,您希望在队列上而不是在堆栈上捕获一个拒绝承诺而不会收到警告(很快就会被弃用并出现错误)。 here 解释了如何做到这一点。

或者您只是想拒绝一个承诺,因为解析值不是您所期望的,您可以按照 Phil 提供的方式抛出或返回 Promise.reject("Something should not be null")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2017-12-20
    • 2022-01-22
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多