首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pharo管道承诺

Pharo管道承诺
EN

Stack Overflow用户
提问于 2018-08-12 23:12:44
回答 1查看 107关注 0票数 2

考虑以下承诺类:--它实现了许多语言中的承诺回调机制。也被称为期货。

代码语言:javascript
复制
Object subclass: #Promise
    instanceVariableNames: 'promiseValue promiseError promiseLock'
    classVariableNames: ''
    package: 'META-Project-[pgakuo]'

它有一些方法,但下面这两种方法与未来的流水线有关:

该方法采用块闭包,并将其值存储在promiseValue变量中,全部保存在后台。

代码语言:javascript
复制
value: aBlock 
    promiseLock := Semaphore new.
    [[[promiseValue := aBlock value] 
    on: Error do: [:err | promiseError := err]]
    ensure: [promiseLock signal]] forkAt: Processor userBackgroundPriority.

此方法等待块的完全执行,然后将前一个块的值提供给下一个块,即它的参数。

代码语言:javascript
复制
then: aBlock
    promiseLock isSignaled ifFalse: [
        promiseLock wait.           
        promiseValue ifNotNil: [ aBlock value: promiseValue ] ] fork.

到类BlockClosure --我添加了以下方法:

代码语言:javascript
复制
promiseValue
    ^ Promise new value: self 

因此,我可以实现“承诺类似”的行为,如下所示。操场上的以下代码不会冻结UI:

代码语言:javascript
复制
[ 12 seconds wait. 12 ]promiseValue then: [ :a|  Transcript crShow: a/2 ] 

也就是说,它在没有冻结UI的12秒后打印6。但是,我需要将这些承诺编成管道,如下所示。

代码语言:javascript
复制
([ 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。

我怎样才能实现这种流水线?

EN

回答 1

Stack Overflow用户

发布于 2018-08-19 13:00:35

首先,只有当每个Promise都应该构建一个新的承诺时,您才会创建一个#then:实例。通过重复使用承诺,你很容易陷入种族状况。

其次,您要分叉传递给#ifFalse:#Promise>>then:块。我假设您在那里做了一个错误,因为该代码会引发异常,因为#fork不回答布尔值。

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

https://stackoverflow.com/questions/51813605

复制
相关文章

相似问题

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