- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在考虑什么时候我需要拒绝一个 promise 。我发现了一些关于这个主题的问题,但找不到正确的答案。 When should I reject a promise?
这篇文章 http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises说:
这是基本准则吗?只有在发生异常时才拒绝 promise ?
但如果是这样的功能
findUserByEmail()
我希望该函数返回一个用户,这样我就可以在不验证结果的情况下继续执行链
findUserByEmail()
.then(sendWelcomeBackEmail)
.then(doSomeNiceStuff)
.then(etc..)
什么是最好的/常见的做法?
最佳答案
一般而言,您可以认为拒绝类似于同步 throw
,而履行类似于同步 return
。每当功能以某种方式不成功时,您都应该拒绝。这可能是超时、网络错误、输入错误等。
拒绝 promise ,就像抛出异常一样,对控制流很有用。它不必代表真正的意外错误;它可以代表您完全预期和处理的问题:
function getProfile(email) {
return getProfileOverNetwork(email)
.then(null, function (err) {
//something went wrong getting the profile
if (err.code === 'NonExistantUser') {
return defaultUser;
} else if (profileCached(email)) {
return getProfileFromCache(email);//fall back to cached profile
} else {
throw err;//sometimes we don't have a nice way of handling it
}
})
}
拒绝让我们跳过正常的成功行为,直到我们找到一个知道如何处理它的方法。作为另一个例子,我们可能有一些深深嵌套在应用程序堆栈底部的函数,它会拒绝。这可能要到堆栈的最顶端才能处理,我们可以在其中记录它。关键是拒绝像同步代码中的异常一样在堆栈中向上传播。
一般来说,只要有可能,如果您正在努力编写一些异步代码,您应该考虑“如果这是同步的,我会写什么”。从它到 promise 的等价物通常是一个相当简单的转换。
在 exists
方法中可能使用被拒绝的 Promise 的一个很好的例子:
function exists(filePath) {
return stat(filePath) //where stat gets last updated time etc. of the file
.then(function () { return true; }, function () { return false; })
}
请注意,在这种情况下,拒绝完全是意料之中的,只是意味着文件不存在。还要注意它是如何与同步函数并行的:
function existsSync(filePath) {
try {
statSync(filePath);
return true;
} catch (ex) {
return false;
}
}
回到你的例子:
如果没有找到用户,我通常会选择拒绝由 findUserByEmail
产生的 promise 。这是您完全期望有时会发生的事情,但它是规范的异常(exception),并且应该与所有其他错误非常相似地处理。同样,如果我正在编写一个同步函数,我会让它 throw
异常。
有时只返回 null
可能会有用,但这取决于您的应用程序逻辑,可能不是最好的方法。
关于node.js - 何时拒绝/解决 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17293546/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!