拒绝尝试/不等待的承诺

如何解决拒绝尝试/不等待的承诺

demo1和demo2的唯一区别是demo2添加了 await 。为什么demo1没有捕获到错误而demo2没有捕获到错误?

// demo1
try {
    new Promise((resolve,reject) => {
        resolve()
    }).then(() => { throw new Error('haha') }) // Promise: {status: "rejected",value: Error: haha }
    console.log('irene test') // print 'irene test',execution is over.
} catch(err) { // didn't catch the error
    console.log('irene')
    console.log(err)
}

enter image description here

// demo2
try {
    await new Promise((resolve,reject) => {
        resolve()
    }).then(() => { throw new Error('haha') })
    console.log('irene test') // didn't print 'irene test'
} catch(err) { // catch the error
    console.log('irene') // print 'irene'
    console.log(err) // print err
}

enter image description here

解决方法

唯一的区别是此代码:

val df = spark.sparkContext.parallelize(Seq("2020-04-21 10:43:12.000Z","20-04-2019 10:34:12","11-30-2019 10:34:12","2020-05-21 21:32:43","20-04-2019","2020-04-21")).toDF("ts")

def strToDate(col: Column): Column = {
    val formats: Seq[String] = Seq("dd-MM-yyyy HH:mm:SS","yyyy-MM-dd HH:mm:SS","dd-MM-yyyy","yyyy-MM-dd")
    coalesce(formats.map(f => to_timestamp(col,f).cast(DateType)): _*)
  }

val formattedDF = df.withColumn("dt",strToDate(df.col("ts")))

formattedDF.show()
+--------------------+----------+
|                  ts|        dt|
+--------------------+----------+
|2020-04-21 10:43:...|2020-04-21|
| 20-04-2019 10:34:12|2019-04-20|
| 2020-05-21 21:32:43|2020-05-21|
|          20-04-2019|2019-04-20|
|          2020-04-21|2020-04-21|
+--------------------+----------+

等于这个:

library( data.table )
library( ggplot2 )
library( gridExtra )   #for merging two plots together

#sample data 
# !! ALTERED STOP_TIME IN ROW2 !!
DT <- fread("TASK_ID START_TIME   STOP_TIME     PERSON_ID TASK_GROUP
3983947 8/3/20T13:35 8/3/20T13:36 100       1
3983946 8/3/20T13:35 8/3/20T13:37 102       3
3983945 8/3/20T13:32 8/3/20T13:34 102       1
3983944 8/3/20T13:32 8/3/20T13:35 104       2
3983943 8/3/20T13:30 8/3/20T13:32 104       1
3983942 8/3/20T13:29 8/3/20T13:30 104       6
3983941 8/3/20T13:27 8/3/20T13:35 107       1
3983940 8/3/20T13:26 8/3/20T13:35 100       1
3983939 8/3/20T13:26 8/3/20T13:35 103       4
3983938 8/3/20T13:23 8/3/20T13:35 106       1
3983937 8/3/20T13:21 8/3/20T13:29 104       4
3983936 8/3/20T13:20 8/3/20T13:32 102       1
3983935 8/3/20T13:20 8/3/20T13:27 107       3
3983934 8/3/20T13:19 8/3/20T13:20 102       1
3983933 8/3/20T13:19 8/3/20T13:26 100       5")

#set timestamps to posixct
cols = grep( "TIME$",names(DT),value = TRUE )
DT[,(cols) := lapply( .SD,as.POSIXct,format = "%d/%m/%yT%H:%M"),.SDcols = cols ]

#create barchart
plot1 <- ggplot( data = DT ) + 
  geom_rect( aes( xmin = START_TIME,xmax = STOP_TIME,ymin = 0,ymax = 1,fill = as.factor(TASK_GROUP) ) ) +
  facet_wrap( ~PERSON_ID,ncol = 1,scales = "free_x" ) +
  coord_cartesian( xlim = c( min( DT$START_TIME,na.rm = TRUE ),max( DT$STOP_TIME,na.rm = TRUE ) ) ) +
  theme(axis.title.y = element_blank(),axis.text.y  = element_blank(),axis.ticks.y = element_blank()) + 
  guides(fill = FALSE)

#prepare data for piecharts
DT.pie <- DT[,duration := as.numeric( STOP_TIME - START_TIME ) ]
#calculate percentages
DT.pie[,percentage := duration / sum( duration ),by = .(PERSON_ID) ]

#create piechart
plot2 <- ggplot( data = DT.pie,aes( x = 1,y = percentage,fill = as.factor( TASK_GROUP ) ) ) +
  geom_bar( width = 1,stat = "identity" ) +
  facet_wrap( ~PERSON_ID,ncol = 1 ) +
  coord_polar(theta = "y",start=0) +
  theme(axis.title.x = element_blank(),axis.text.x  = element_blank(),axis.ticks.x = element_blank(),axis.title.y = element_blank(),axis.ticks.y = element_blank(),) + 
  labs( fill = "Task" )

#combine barchart and piechart
grid.arrange(plot1,plot2,ncol=2)

正如您在此处看到的,try { new Promise((resolve,reject) => { resolve() }).then(() => { throw new Error('haha') }) // Promise: {status: "rejected",value: Error: haha } console.log('irene test') // print 'irene test',execution is over. } catch(err) { // didn't catch the error console.log('irene') console.log(err) } 的范围与try catch的范围不同。

,

在demo1中,控制流在console.log('irene test')之后立即退出try catch块。因此,在Promise中引发错误之前,错误会不断发展。见下文。

try{
    new Promise((resolve,reject) => {
        resolve()
    }).then(() => { throw new Error('haha')})
    console.log('irene test')
} catch(err) { // catch the error
    console.log('irene') // print 'irene'
    console.log(err) // print err
}
console.log('already here')

result image 您会看到在打印“已经在这里”后引发错误。

如您所知,在demo2中,promise保留在try catch块中,直到引发错误为止。 (因为那是等待中的事情)

此外,如果即使出现错误也要打印“ irene测试”,最好使用.catch

new Promise((resolve,reject) => {
  resolve()
}).then(() => { throw new Error('haha')
}).catch(err => console.error(err))
console.log('irene test')

它成功地捕获了错误,并且还可以打印“ irene测试”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-