【问题标题】:Promise is rejecting even tho it is true承诺是拒绝即使它是真的
【发布时间】:2021-10-11 14:56:26
【问题描述】:

如果 lunchTime 为 true,则应记录午餐对象,如果应为 false err。

控制台正在记录:错误:OOOOOPs
即使我尝试在 then 语句中记录午餐对象,它也只会记录错误消息

我的计划是手动将 lunchTime 的值切换为 false,以便我可以测试 解决/拒绝部分承诺,但它正在运行代码的捕获部分,即使它应该解决。

const lunchTime = true;
    
    function orderMeSomeFood() {
        return new Promise((resolve, reject) => {
            if (lunchTime === true) {
                let lunch = {
                    food: "BBQ",
                    drink: "Zen WTR"
                };
    
                resolve(lunch);
            }
            else if (lunchTime === false) {
        const err = new Error('OOOOOPs')
        reject(err);
    }
            }
        })
    };
    
    orderMeSomeFood().then(() => {
        console.log(resolve);
    }).catch(() => {
        console.log(Error('OOOOOPs'));
    })

【问题讨论】:

  • orderMeSomeFood 返回的 Promise 没有拒绝。它在console.log(resolve); 中引发异常,因为resolve 没有在那里定义。 (记录传递给.catch() 的参数会显示给您。)
  • 我应该如何使用 then catch 语句在 true 时记录午餐对象,在 false 时记录错误消息?
  • 您的编辑又错了(现在err 也未定义)。来自 Promise 函数内部的值不在 then/catch 回调的范围内,因为您将它们命名为相同。您需要将它们作为参数获取
  • 请不要在提供答案后更改问题中的代码,因为这可能会破坏人们已经对您的原始问题做出的贡献。下面的两个答案中提供了您需要了解的有关原始代码的所有信息。

标签: javascript jquery ecmascript-6 es6-promise


【解决方案1】:

问题其实出在这行代码上:

console.log(resolve);

也许你的本意是:

console.log("resolved");

相反。实际的resolve 变量和值只存在于new Promise() 执行器函数中,而不存在于其他地方。所以,这会引发异常。

如果您没有意识到这一点,.then().catch() 处理程序中的异常将触发承诺链中的下一个 .catch() 处理程序被调用。因此,当上述异常发生在 .then() 处理程序内部时,会导致代码执行跳转到下一个 .catch() 处理程序。


如果添加这个调试:

    orderMeSomeFood().then(() => {
        console.log("got to .then() handler");
        console.log(resolve);
    }).catch((e) => {
        console.log(e);
    });

然后,您将看到它到达了.then() 处理程序,然后您将看到catch 处理程序中的实际错误是ReferenceError: resolve is not defined,并且行号将指向console.log(resolve) 作为违规语句.


这里的一个教训是始终记录您在.catch() 中遇到的实际异常,因为这通常是您的代码为何到达那里的有用提示。


这是一个带有更多日志的可运行版本,可向您展示实际流程:

const lunchTime = true;

function orderMeSomeFood() {
    return new Promise((resolve, reject) => {
        if (lunchTime === true) {
            let lunch = {
                food: "BBQ",
                drink: "Zen WTR"
            };
            console.log("about to resolve promise");
            resolve(lunch);
        } else if (lunchTime === false) {
            console.log("about to reject promise");
            reject(new Error('OOOOOPs'));
        }
    })
};

orderMeSomeFood().then(() => {
    console.log("got to .then() handler");
    console.log(resolve);
}).catch((e) => {
    console.log("got to .catch() handler");
    console.log(e.message, e.stack);
})

提供此输出:

about to resolve promise
got to .then() handler
got to .catch() handler
resolve is not defined ReferenceError: resolve is not defined
    at https://stacksnippets.net/js:32:17

所以,你可以看到以下内容:

  1. 它解决了承诺
  2. 它到达了.then() 处理程序。
  3. console.log(resolve) 代码行的 .then() 处理程序中,它引发了异常
  4. 这会将其发送到 .catch() 处理程序,现在它会在其中记录错误原因

【讨论】:

    【解决方案2】:

    resolve 仅存在于承诺中,因此当您执行 console.log(resolve); 时会引发错误,这就是您看到 OOOOOPs 消息的原因。

    如果你想console.log lunch 变量,你应该把你的代码改成:

    orderMeSomeFood().then(lunch => {
        console.log(lunch);
    }).catch(() => {
        console.log(Error('OOOOOPs'));
    })
    

    const lunchTime = true;
        
        function orderMeSomeFood() {
            return new Promise((resolve, reject) => {
                if (lunchTime === true) {
                    let lunch = {
                        food: "BBQ",
                        drink: "Zen WTR"
                    };
        
                    resolve(lunch);
                }
                else if (lunchTime === false) {
            const err = new Error('OOOOOPs')
            reject(err);
                }
            })
        };
        
        orderMeSomeFood().then(lunch => {
            console.log(lunch);
        }).catch(() => {
            console.log(new Error('OOOOOPs'));
        })

    【讨论】:

    • 我先尝试了这个,但没有成功,这就是我尝试使用 resolve 的原因。当我写的代码和你的一模一样时,我仍然得到一个错误。
    • @Wayne 我添加了一个代码 sn-p,只需将Error 更改为new Error 并删除一个额外的}
    • 我明白了,问题是我没有给函数一个参数,这在我的其他项目中也是一个问题;非常感谢你!!!所以只是为了澄清 promise 中的 resolve 函数类似于 return 语句?这意味着它传递了午餐变量,但由于我没有给 then 函数一个参数,所以它无法接受午餐变量。
    • @Wayne 是的,类似,听起来你明白了,.then 会等到promise 解析完毕,你传递给resolve 的值会变成@987654334 的结果@。 Promise
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2019-11-25
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多