【问题标题】:Return false from Promise: should it resolve(false) or reject()?从 Promise 返回 false:它应该解析(false)还是拒绝()?
【发布时间】:2018-02-15 16:00:14
【问题描述】:

我正在通过 HTTP 向服务器发出请求,以查看是否存在具有特定电子邮件的用户。

function userExists(id) {
    return makeHttpRequestToServer(id)
        .then((response) => {
            if (response === 200) {
                // User exists in the database
            } else if (response === 404) {
                // User does not exist in the database
            }
        });
}

我不确定应该如何处理resolve/reject 电话:

  • 在数据库中找到用户时我应该resolve(),在数据库中找不到用户时应该reject()吗?
  • 在数据库中找到用户时我应该resolve(true),在数据库中找不到用户时我应该accept(false)吗?

【问题讨论】:

    标签: error-handling promise


    【解决方案1】:

    您应该使用resolve 返回任何非错误响应,而reject 仅用于错误和异常。

    在不包含该条目的数据库中搜索特定条目不一定是错误,因此您应该resolve(false)

    function userExists(id) {
        return makeHttpRequestToServer(id)
            .then((response) => {
                if (response === 200) {
                    // User exists in the database
                    resolve(true);
                } else if (response === 404) {
                    // User does not exist in the database
                    resolve(false);
                } else {
                    // Something bad happened
                    reject(new Error("An error occurred"));
                }
            });
    }
    

    这样更容易区分返回 false 和发生错误。

    在处理回调时,通常会为错误响应保留第一个返回的参数,为返回值保留剩余的参数。

    function userExists(id, callback) {
        makeHttpRequestToServer(id)
            .then((response) => {
                if (response === 200) {
                    // User exists in the database
                    callback(undefined, true);
                } else if (response === 404) {
                    // User does not exist in the database
                    callback(undefined, false);
                } else {
                    // Something bad happened
                    callback(new Error(response));
                }
            }
    }
    

    【讨论】:

    • 在这个特定示例中,您不需要 Promise 包装器,因为似乎 makeHttpRequest 已经返回了一个 Promise。也许,显示一个有回调的 api?
    • @DavinTryon 你说得对,Promise 包装器是多余的。我已将其删除,并添加了一小部分关于回调的内容。
    • @DavinTryon 好的,我刚刚意识到,Promise 包装器不是多余的,因为我需要它,所以我可以拥有 resolvereject 函数。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2015-10-17
    • 2012-05-14
    相关资源
    最近更新 更多