- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为:
([ 30 seconds wait. 4 ]promiseValue )then: [ :a| Transcript crShow: a ].
这意味着 promise 将在后台等待 30 秒并打印在 Transcript 上。这不应导致 Pharo 用户界面卡住。我下面的实现卡住了用户界面。为什么?
实现 Promises 行为的类 promise:
Object subclass: #Promise
instanceVariableNames: 'promiseValue promiseError promiseLock'
classVariableNames: ''
package: 'META-Project-[pgakuo]'
Promise 类中的方法
doesNotUnderstand: aMessage
^ self value
perform: aMessage selector
withArguments: aMessage arguments
then: aBlock
promiseLock isSignaled
ifTrue: [ ^ self ].
promiseLock wait.
promiseError
ifNotNil: [ promiseError
privHandlerContext: thisContext;
signal ].
aBlock value: promiseValue.
self value: aBlock
then: aBlock catch: anotherBlock
promiseLock isSignaled
ifFalse:
[ promiseLock wait.
promiseError ifNotNil: [ anotherBlock value: promiseError ].
promiseValue ifNotNil: [ aBlock value: promiseValue. self value: aBlock ]]
value
promiseLock isSignaled ifFalse: [ promiseLock wait ].
promiseError ifNotNil:
[ promiseError
privHandlerContext: thisContext;
signal ].
^promiseValue
value: aBlock
promiseLock := Semaphore new.
[
[[promiseValue := aBlock value]
on: Error do: [:err | promiseError := err]]
ensure: [promiseLock signal]] fork
并向 Blockclosure 添加了一种方法,使闭包使用 Promise 行为。
promiseValue
^ Promise new value: self
一个 block 被传递给一个Promise的实例,它被Promise执行>>value:它使用fork在后台执行任务。但它似乎并没有按预期工作
最佳答案
在 Playground 中工作时,您将在 UI 流程中工作。因此,您实际上是在用您的示例暂停 UI 进程。试试这个:
[ ([ 30 seconds wait. 4 ] promiseValue) then: [ :a |
Transcript crShow: a ] ] forkAt: Processor userBackgroundPriority.
由于原始表达式明确要求不锁定 UI,因此您应该做的是:
#doesNotUnderstand:
你有一个选择:
在评估 promise 时总是 fork
这会产生进程调度和进程创建的开销。您还将丢失原始流程的上下文,除非您明确保存它(消耗内存,导致性能损失)
只有当当前进程是UI进程时才会fork
判断当前进程是否为UI进程,简单快捷。这不是您通常会做的事情,但对于您的情况,我建议您采用这种方法。
我建议为 Promise
实现一个类端方法,例如Promise 类>>值:
。这将使您能够将此特定案例与其余实现隔离开来。例如
value: aBlock
| instance |
instance := self new.
self isUIProcess
ifTrue: [ [ instance value: aBlock ] forkAt: Processor userBackgroundPriority ]
ifFalse: [ instance value: aBlock ].
^ instance
关于promise - Pharo promise :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51805017/
四处查看图片并搜索“:=”不会产生很快弹出的相关结果。 赋值在 Pharo 图像中的具体位置以及如何实现? 最佳答案 赋值被翻译成字节码指令。对临时变量的赋值转换为 popIntoTemp:,它将当前
是否可以监听类在更改时抛出的事件?我需要知道系统浏览器中某些类中的某些内容(代码、变量等)何时发生变化。 最佳答案 注意,自 Pharo 2.0 以来,现在有一个 SystemAnnouncer 可以
我在 Pharo 中有一个 do: 需要很长时间来处理。我想向用户展示它的进度。这在 Pharo 中是如何完成的? 最佳答案 这里有两种方式: Collection 借鉴了 UIManager 并支持
在 Nautilus 系统浏览器 (Pharo 6) 中,有一个右键单击命令可以Add package... 以及 Add class... 甚至 Add protocol...,但我无法在任何地方找
有时,最好暂时使用已弃用的方法,而不是创建一个项目的多个分支来支持多个版本的 Pharo。至少,我有时就是这样做的。但是,调用已弃用的方法会使我的单元测试在 Pharo 3.0 中失败。 有什么我可以
我在网上查过 @ 的含义Pharo 中的接线员,但找不到任何东西。 Pharo是什么意思@运算符(operator)?例如,为什么25@50评估为:"(25@50)" ? 最佳答案 在 Smallta
我不明白如何创建我自己的 Slot 子类并在 Pharo 中使用它。问题是槽处理代码似乎需要我实现#size 和#index,但我不知道该放什么。 用例是表示配置的类的定义。用户可以指定部分配置,并依
我可能刚刚错过了它们,但我似乎在 Pharo 中找不到任何提及不可变数据结构的内容。来自函数式语言,我发现不可变 map 和 set 在各种场合都很有用。尽管 Pharo 对使用变异有特别的偏见,但如
我正在寻找一种方法,在给定包名称的情况下,加载该包在给定日期的最新版本。 例如: HypotheticalClassLoader loadPackage: 'Athens-Core' onDate:
使用 2.0入门,熟悉 Smalltalk,因此我在图像或“实例”一书中(已过时)找不到工具问题。 寻找输入字段(不是现成的对话框)。喜欢: (TextMorph new) contents: '(e
我正在查看 Pharo Smalltalk 的语法,并且想知道如何实现二进制消息的优先级。 如何声明这样的二进制消息? 系统如何确定一元消息的优先级? 最佳答案 用于实现二进制消息: 是的,例如,您可
对于Pharo的新手,如何创建一个包? MOOC exercise说“使用浏览器创建一个包”,但是如何? 最佳答案 您可以在 3.2 Creating a new Package in Pharo b
我关闭了标题为“Welcome to Pharo 2.0”的工作区。如何再次打开它? 最佳答案 尝试打开一个新的空白工作区并使用右上角的三角形转到“以前的内容”条目。您应该在那里找到默认的“欢迎使用
想要尝试使用 Bloc(基本最低要求:创建一个 BlElement),按照基本说明获取包 here : Metacello new baseline: 'Bloc'; repository
我有一个 C 函数,它将字符串复制到传递给它的缓冲区中: void get_machine(char *buf) { /* do something to acquire the machin
我对法罗相当陌生。我正在运行 Ubuntu Raring Ringtail (13.04) 并使用 Pharo 网站上推荐的 PPA 以及 Pharo 30218 图像,并希望启用中键功能。 (我有一
想要将我的小项目从 Pharo 5 迁移到 Pharo 6.1,当我右键单击我的包及其类时,我很高兴地找到了File Out 选项。我看到它为我的图像目录中的那些工件生成文本文件(我在 Windows
normalize: sum | strategy normalizingSum | strategy := sum collect: [ :each | each max: 0.0
为 Pharo 编写基于模拟的单元测试有哪些不同的选择?今天?各有什么优缺点? 最佳答案 还有Mocketry它提供了一个很好的 DSL 关于Pharo 模拟框架,我们在Stack Overflow上
我正在使用 PharoCloud 为我托管 Pharo 图像。默认情况下,它仅将图像的 ZIP 下载到我的设备;此 ZIP 不包含 .sources 文件。 我正在尝试使用 ZnClient 手动下载
我是一名优秀的程序员,十分优秀!