首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重新启动中断的promise评估是个问题吗?

重新启动中断的promise评估是个问题吗?
EN

Stack Overflow用户
提问于 2020-10-01 16:27:20
回答 1查看 1.7K关注 0票数 2

使用delayedAssign()创建promise,很容易构建一个可能导致restarting interrupted promise evaluation警告发出的场景。为什么在这种情况下会抛出警告?此警告是否表示“不安全”的做法,或者这更多的是“供参考”,可以安全地忽略(即消声)?考虑以下示例:

代码语言:javascript
运行
复制
counter <- 0L

make_val <- function() {

  if (counter < 1L) {
    counter <<- counter + 1L
    stop("insufficient count")
  }

  "yay!"
}

delayedAssign("foo", make_val())

foo
#> Error in make_val() : insufficient count

foo
#> [1] "yay!"
#> Warning message:
#> restarting interrupted promise evaluation

foo
#> [1] "yay!"

将此警告静默是否安全?或者重新启动中断的承诺评估是应该避免的事情?

代码语言:javascript
运行
复制
get_foo <- function() {

  mute_ripe <- function(warn) {

    if (identical(conditionMessage(warn),
                  "restarting interrupted promise evaluation")) {

      invokeRestart("muffleWarning")
    }
  }

  tryCatch(
    withCallingHandlers(get("foo", envir = .GlobalEnv), warning = mute_ripe),
    error = function(err) NULL
  )
}

counter <- 1L
delayedAssign("foo", make_val())

get_foo()
#> NULL

get_foo()
#> [1] "yay!"

get_foo()
#> [1] "yay!"
EN

回答 1

Stack Overflow用户

发布于 2020-10-01 17:52:47

我会保留这条警告信息。考虑下面的例子

代码语言:javascript
运行
复制
counter <- 0L

make_val <- function() {
  counter <<- counter + 1L
  if (counter == 4L) {
    stop("somehow triggered an error halfway through")
  }
  counter
}

for (letter in letters[1:10]) {
    delayedAssign(letter, make_val())
}

a; b; c; d; e; f; g; h; i; j

在这里,我将在将来将1:10赋值给变量a-j。每个变量都是状态相关的,因为当且仅当前一个赋值成功时,才会为变量赋值(但不是推荐的做法)。如果以某种方式在求值链中途发生错误,那么您可以看到求值正好在发生错误的地方停止。

代码语言:javascript
运行
复制
> a; b; c; d; e; f; g; h; i; j
[1] 1
[1] 2
[1] 3

Error in make_val() : somehow triggered an error halfway through

然而,如果您重新运行代码,那么您可以成功地完成每个任务,但您只是得到了一组错误的结果。

代码语言:javascript
运行
复制
> a; b; c; d; e; f; g; h; i; j
[1] 1
[1] 2
[1] 3
[1] 5
Warning message:
restarting interrupted promise evaluation 
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11

如果没有这样的警告消息,那么我认为用户可能无法识别这组错误结果的可能性不为零,因为当用户尝试重新运行代码进行调试时,赋值是没有错误的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64151612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档