考虑以下承诺类:--它实现了许多语言中的承诺回调机制。也被称为期货。
Object subclass: #Promise
instanceVariableNames: 'promiseValue promiseError promiseLock'
classVariableNames: ''
package: 'META-Project-[pgakuo]'它有一些方法,但下面这两种方法与未来的流水线有关:
该方法采用块闭包,并将其值存储在promiseValue变量中,全部保存在后台。
value: aBlock
promiseLock := Semaphore new.
[[[promiseValue := aBlock value]
on: Error do: [:err | promiseError := err]]
ensure: [promiseLock signal]] forkAt: Processor userBackgroundPriority.此方法等待块的完全执行,然后将前一个块的值提供给下一个块,即它的参数。
then: aBlock
promiseLock isSignaled ifFalse: [
promiseLock wait.
promiseValue ifNotNil: [ aBlock value: promiseValue ] ] fork.到类BlockClosure --我添加了以下方法:
promiseValue
^ Promise new value: self 因此,我可以实现“承诺类似”的行为,如下所示。操场上的以下代码不会冻结UI:
[ 12 seconds wait. 12 ]promiseValue then: [ :a| Transcript crShow: a/2 ] 也就是说,它在没有冻结UI的12秒后打印6。但是,我需要将这些承诺编成管道,如下所示。
([ 12 seconds wait. 12 ] promiseValue then: [ :a| Transcript crShow: a / 2 ] )then: [ :b| Transcript crShow: b / 2 ] 因此,我试图通过添加then:来存储传递给允诺方法self value: aBlock .的块的值,即存储当前块作为promiseValue传递给then:的值,以便管道中的下一个then:能够读取这个值。
上面应该打印6,然后打印6,但它只打印6。这意味着它不存储6,因为它的promiseValue和流水线then:既不读取这6,也不读取先前存储的promiseValue ( 12 )。检查承诺对象显示它的promiseValue仍然是12。
我怎样才能实现这种流水线?
发布于 2018-08-19 13:00:35
首先,只有当每个Promise都应该构建一个新的承诺时,您才会创建一个#then:实例。通过重复使用承诺,你很容易陷入种族状况。
其次,您要分叉传递给#ifFalse:的#Promise>>then:块。我假设您在那里做了一个错误,因为该代码会引发异常,因为#fork不回答布尔值。
https://stackoverflow.com/questions/51813605
复制相似问题