Task.js是Mozilla进行的一项实验,旨在使JavaScript中的异步协作式任务看起来更加优美。它可以通过在最新版本的JavaScript中重新使用新的yield命令来工作-这是非常聪明的东西!
看起来一切正常,但是它需要ES6和对生成器的支持,这意味着目前仅在Firefox中可以使用。
如果您了解一点JavaScript,那么您还将知道异步编程是使其正常工作的关键。您不能简单地将执行结果的单线程耗费在系统和UI停止工作上。但是对于依赖异步编程的语言,JavaScript几乎无法提供帮助来解决非常混乱的编程习惯。
最新的想法是利用生成器功能和新的yield命令。这使函数可以像返回一样将结果返回给调用者。不同之处在于,调用函数可以使函数从其上次中断的地方继续执行-这是一种有限的延续形式。
新框架实现了调度程序,并使用yield命令允许包装为任务的函数挂起其执行,直到完成一些异步操作为止。主要限制是,作为yield命令一部分调用的操作必须返回Promise对象。例如,大多数jQuery异步方法至少具有返回Promise或Deferred对象的选项。
因此,要等待返回值的异步调用的任务只是使用:
var结果= yield myAsynchMethod(arguments);
yield和myAsynchMethod返回的promise对象一起将控制权返回给调度程序。然后,调度程序将运行另一个任务,或者返回其线程以处理UI的事件。当myAsynchMethod完成时,它将解析promise并使用其结果值调用onResolve。这再次唤醒调度程序,并使用该值并使用send(value)命令以收益率继续执行原始任务。结果导致值而不是承诺被存储在结果中。
请注意,就使用框架和异步方法的程序员而言,无需了解有关Promise或一切工作原理的任何知识。如果您具有异步方法,则可以通过简单地使用yield来调用它,从而以一种似乎是同步的方式对其进行调用。
正如task.js网站所说:
生成者+承诺=任务您可以在task.js网站上看到完整的示例:
spawn(function *(){var data = yield $ .ajax(url); $(“#result”)。html(data); var status = $(“#status”)。html(“ Download complete。”) ; yield status.fadeIn()。promise(); yield sleep(2000); status.fadeOut();});
关于task.js的工作原理,有很多细节,这是对ES6中添加的功能的一种有趣而巧妙的重新利用。毕竟,yield的真正目的是使编写迭代器变得容易,并且不允许异步操作将控制权交给调用函数。
task.js会流行吗?
它必须协商的第一个障碍是,所有浏览器都必须支持ES6,并且所有(或至少大多数)异步操作都需要返回承诺。这两个条件都需要一段时间才能成为现实。
然后是另一种方法,可以在JavaScript中构建更好的异步工具。许多程序员认为C#的async和await命令是执行异步操作的最佳方法。也许比重新产生收益更好的解决方案是添加JavaScript异步并等待。
无论未来如何发展,仅是了解task.js的工作原理,都非常值得一看。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。