首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl 6中“等待做”是什么?

在Perl 6中“等待做”是什么?
EN

Stack Overflow用户
提问于 2016-11-23 10:12:01
回答 1查看 395关注 0票数 11

我在Perl 6中看到了以下代码:

代码语言:javascript
复制
await do for @files -> $file {
    start {
       #do something ...    }
}

在异步模式下运行。为什么上面的代码需要do?Perl 6中的do的目的是什么?有谁能详细解释一下上面的代码吗?

还有一个选项是这样写的:

代码语言:javascript
复制
for @files -> $file {
    start {
       #do something ...    }
}

然后等着代码才能兑现承诺?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-23 12:11:59

do的目的

for关键字可以以两种不同的方式使用:

( 1)作为一项独立的区块声明:

代码语言:javascript
复制
for 1..5 { say $_ }

( 2)作为附加于语句末尾的语句修饰符:

代码语言:javascript
复制
say $_ for 1..5;

当在更大的语句中间遇到裸for关键字时,它被解释为第二种形式。

如果要在更大的语句中使用块表单(例如,作为await函数的参数),则必须在其前缀加上do,以告诉解析器在这里启动块语句,并希望得到它的返回值。

更普遍地说,do确保使用相同的规则解析它所遵循的内容,就像解析它自己的语句一样,并使它提供一个返回值。因此,它允许我们使用任何语句作为更大语句中的表达式。do ifdo while等都是以相同的方式工作的。

对代码的解释

你展示的密码..。

代码语言:javascript
复制
await do for @files -> $file {
    start {
       #do somthing ...    }
}

...does如下:

  • 它在数组@files上循环。
  • 对于每一次迭代,它都使用start关键字来调度一个异步任务,该任务可能对当前元素$file执行一些操作。( $*SCHEDULER变量决定任务的实际启动方式;默认情况下,它使用一个简单的线程池调度程序。)
  • 每次对start的调用都会立即返回一个Promise,该Promise将在异步任务完成后进行更新。
  • do for收集循环体的所有返回值(即承诺)的序列。
  • await函数接受这个序列作为它的参数,并等待直到所有的承诺完成。

如何“等待代码”

我不太明白你在这里的意思。如果您想记住这些承诺,而不是等待它们,只需将它们存储在一个数组中:

代码语言:javascript
复制
my @promises = do for @files -> $file {
    start {
       #do something ...    }
}

#other code ...

await @promises;

对于等待所有计划/运行的任务,没有方便的功能。你总是要记住承诺。

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

https://stackoverflow.com/questions/40761460

复制
相关文章

相似问题

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