来源于个人理解的翻译。

创建一个 promise:

my $p = Promise.new;

可以打印运行 的Promise 状态:

my $p = Promise.new();

$p.then({say 'hello, world'});
say $p.status;

上面的promise创建好后, 当 $p 状态为 kept或broken 时, 会执行 then 里面的 匿名函数。

但是, 上面的$p状态总是为: Plannd。

所以, 那个 hello, world 总是不能打印。

那怎么办呢?

Promise 有两个 函数用于更改 promise状态:

. keep
. break

可以改成这样:

my $p = Promise.new();

$p.then({say 'hello, world'});
say $p.status; $p.keep;
say 'Result ~ '~$p.result;

结果如下:

C:\p6>perl6 scan_dir.p6
Planned
hello, world
Result ~ True C:\p6>

如果把 keep 改为 break的话, 也会让 匿名函数执行, 同时会引发一个常常:

my $p = Promise.new();

$p.then({say 'hello, world'});
say $p.status;
$p.break;
say 'Result ~ '~$p.result;

运行结果如下:

C:\p6>perl6 scan_dir.p6
Planned
hello, world
Tried to get the result of a broken Promise
in block <unit> at scan_dir.p6 line Original exception:
False
in block <unit> at scan_dir.p6 line C:\p6>

注意这里的匿名函数, 当 Promise 执行 kept或 broken 方法时, 会执行它, 最后 promise中的result方法会返回一个值, 这个返回值是传递给 keep 或 break的值或者是then返回了另一个新Promise

的result值(这个值是匿名函数的返回值):

my $p = Promise.new();

$p.then({say 'hello, world'});
say $p.status;
$p.keep('Return for Promise');
say 'Result ~ '~$p.result;
say $p.status;

结果:

C:\p6>perl6 scan_dir.p6
Planned
Result ~ Return for Promise
hello, world
Kept C:\p6>
my $p = Promise.new();

my $p1 = $p.then({ 'hello, world'});
say $p.status;
#$p.keep('Return for Promise');
$p.keep;
say 'Result ~ '~$p.result;
say $p.status;
say $p1.result;

结果:

C:\p6>perl6 scan_dir.p6
Planned
Result ~ True
Kept
hello, world C:\p6>

如果不传递参数执行 $p.keep 时,  匿名函数执行完后, 用 $p.result 会返回一个 True, 这个true 代理 原来的Promise(这里的$p)执行完毕, 状态为 kept。

这个 then 方法, 其实会自动创建一个新的Promise并返回这个Promise(这里的$p1), then方法中的匿名函数参数就是原来的Promise($p), 看如下代码:

my $p = Promise.new();

my $p1 = $p.then(-> $key { say $key.result});
#这里相当于创建了一个新的Promise并返回它
#key 其实就是 $p
$p.keep('This is $p');
#say $p.status;
sleep ;
say $p.status;
say $p1.status;

像一开始所说, Promise.new 创建一个 Promise 时, 默认是不会自动执行的,这时当我们 直接调用 $p.result 想获得 结果时, 程序会一直阻塞(因为我们没有 keep 或 bread 方法告诉这个 promise 让它运行):

my $p = Promise.new();

$p.then({say 'hello, world'});
say $p.status;
say 'Result ~ '~$p.result; #这里会一直阻塞
say 'Done'; #上面被阻塞 , 这里不会运行

那么, 我们能不能一开始创建 一个 promise 后, 让它自动去执行呢?

可以, 用 Promist.start() 方法即可。

Perl6多线程2: Promise new/keep/bread/status/result的更多相关文章

  1. Perl6多线程3: Promise start / in / await

    创建一个Promise 并自动运行: my $p = Promise.start({say 'Hello, Promise!'}); 如果把代码改成如下, 我们会发现什么也没打印: ;say 'Hel ...

  2. Perl6多线程4: Promise allof / anyof

    allof   : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...

  3. Perl6多线程1 Thread : new / run

    先看一个小例子: ) { #默认参数 say $name; } sub B(:name($name)) { #默认参数为 any say $name; } A(); A(); B(); B(name ...

  4. 异步多线程 ASP.NET 同步调用异步 使用Result产生死锁

    一个方法调用了async方法,要将这个方法本身设计为async. public class BlogController : Controller { public async Task<Act ...

  5. 闲话Promise机制

    Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...

  6. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  7. 细嗅Promise

    读完这篇文章,预计会消耗你 40 分钟的时间. Ajax 出现的时候,刮来了一阵异步之风,现在 Nodejs 火爆,又一阵异步狂风刮了过来.需求是越来越苛刻,用户对性能的要求也是越来越高,随之而来的是 ...

  8. promise的学习

    为了解决回调地狱的问题,所以出现了promise的设计思想. promise的三种状态: pending 等待状态 resolved 完成状态 rejected 拒绝状态 promise的三种状态,只 ...

  9. 多线程、多进程、协程、缓存(memcache、redis)

    本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...

随机推荐

  1. npm 安装 不快的解决办法

    npm config list  查看配置 npm config set prefix “c:\dev\nvm\npm”(配置用npm下载包时全局安装的包路径) npm install npm -g ...

  2. DateTime Toxxx() 方法获取时间

    直接上代码 static void Main(string[] args) { DateTime time = DateTime.Now; Console.WriteLine("ToFile ...

  3. HDU4258_Covered Walkway

    题目是一个很典型的斜率优化的题目.题意就不说了. 是这样的,对于双端优先队列,我们共有队首和队尾两个删除操作,来保证对于任意一个i,第一个元素都是最优的. 我们把dp的转移方程列出来就直达其状态为f[ ...

  4. 解析php addslashes()与addclashes()函数的区别和比较

    一. addslashes() 函数 addslashes(string) 函数在指定的预定义字符前添加反斜杠.这些预定义字符是:•单引号 (')•双引号 (")•反斜杠 (\)•NULL  ...

  5. 【Java】常用POI生成Excel文档设置打印样式

    package poi_test; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi ...

  6. DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说

    再次听Puff的时候我想起了Davy. 文理分班后我坐到了他后面.Davy天生一头黄毛,黑头发”not even one”.上课时他若不是肆无忌惮地舒开四肢呼呼大睡,便是如受惊一般伸长他的细脖子,直挺 ...

  7. Linux内核分析8

    周子轩 原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用gdb ...

  8. 洛谷P2398 GCD SUM

    题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式: n 输出格式: sum ...

  9. java 根据包名、目录名获取所有定义的类

    /** * Scans all classes accessible from the context class loader which belong to the given package a ...

  10. python shell

    os.system(cmd) 命令执行结果 0或者1 output = os.popen(cmd) print output.read() 通过 os.popen() 返回的是 file read 的 ...