【问题标题】:How to actually invoke promises?如何实际调用承诺?
【发布时间】:2021-07-01 13:06:41
【问题描述】:

我在看promises package,但我不知道如何真正让承诺做任何事情。所有可用的阻塞机制(如promise_all)都会返回一个promise,而且似乎没有明显的方法可以让promise 一开始就执行。例如,给定以下代码 sn -p:

library(promises)

p <- promise(~ {
  print("executing promise")
}) %>% then(~ {
  print("promise is done")
})

print("we are here")

done <- FALSE
all_promises <- promise_all(p) %>% then(~ {
  print("all promises done")
  done <<- TRUE
})

# output:
# [1] "executing promise"
# [1] "we are here"

我如何实际调用承诺链?

奇怪的是,如果我将第一个承诺更改为 future_promise 并添加一个运行循环,如下所示

while(!done) {
  later::run_now()
  Sys.sleep(0.01)
}

promise 链正确执行。但是,这不适用于常规承诺。

我错过了什么?看来系统缺少执行者,但我在哪里获得执行者?我在包本身中看不到任何内容,也没有用于查询我可以看到的承诺的用户可见 API。

【问题讨论】:

    标签: r asynchronous promise r-promises


    【解决方案1】:

    原来我使用的 API 不正确。 Promise 表达式应该调用延续回调。我错过了那个细节。所以这行得通:

    library(promises)
    
    p <- promise(~ {
      print("executing promise")
      resolve(1)
    }) %>% then(~ {
      print("promise is done")
    })
    
    print("we are here")
    
    done <- FALSE
    all_promises <- promise_all(p) %>% then(~ {
      print("all promises done")
      done <<- TRUE
    })
    
    while(!done) {
      later::run_now()
      Sys.sleep(0.1)
    }
    

    【讨论】:

    • 代码中的promise_all 调用没有任何作用,是吗?无论如何,你只有一个承诺。无需包裹它。并且不要因为错误地使用 API 而感到难过……毕竟,这是 nowhere 记录在案的。这实际上是文档中的一个奇怪的疏忽。
    • 我好像是个盲人。它记录在案,就在promise 文章的中间,它所属的地方。只是介绍性文章不提,还是有点奇怪。
    • @KonradRudolph 是的,同样的事情也发生在我身上。它就在那里,但它并不明显,除非一个人真正阅读 文档(无论如何谁会这样做,对吧?)。至于 all_promises()... 我只是把它留在那里作为 Promise 集合的一个例子。你是对的,它在这个特定的代码中什么都不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2014-11-07
    • 2022-01-08
    • 2018-07-06
    • 2014-12-29
    相关资源
    最近更新 更多