如何在javascript中实现异步编程(promise)?是't javascript是一个ui线程环境
how is async programming (promises) implemented in javascript? isn't javascript a ui-threaded environment?
JS中的Promises允许您进行异步编程,如下所示:
DoSomething().then(success, failure);
DoSomethingElse();
每当我写入前一个代码时,它在到达success
之前到达DoSomethingElse()
。这怎么可能?JS不是一个单线程环境吗(不包括web工作者)?setTimeout
完成了吗?
是的,JavaScript是单线程的,这意味着您永远不应该阻塞这个单线程。任何长时间运行的等待操作(通常是AJAX调用或睡眠/暂停)都是使用回调实现的。
如果不考虑实现,就会发生以下情况:
-
CCD_ 4被调用并且它接收CCD_ 5和CCD_。
-
它做它需要做的事情(可能启动长时间运行的AJAX调用)并返回
-
DoSomethingElse()
被称为 -
。。。
-
一段时间后AJAX响应到达。它调用先前定义的
success
和failure
函数
另请参阅(类似问题)
- 等效于SwingUtilities.invokeLater()的JavaScript
- 有什么原子javascript操作可以处理Ajax吗;异步性
- 使用Ajax的jqGrid自定义编辑规则函数显示";自定义函数应返回数组"
JavaScript中的Promise通常涉及某种调用链或流畅的方法调用API,其中函数结果通常提供延续方法,如with、then、when、whenAll等,加上一些状态标志,指示结果是否真的可用。具有输入参数的函数还可以支持承诺值检测输入是否为承诺,并将其功能封装到一个thunk中,当承诺值准备好时,该thunk可以被链接。
有了这些,您可以提供一个promise模拟类似以下并行语言的环境:
MyApi.LongRunningTask().then(函数(结果){MyAppi.LongOtherTask(结果);}).then
或者长时间运行的呼叫不依赖的顺序用例:
var value1=MyApi.LongRunningTask()
var value2=MyApi.LongRunningOtherTask();
MyApi.DoSomeFunction(value1,value2).then==>DoSomeFunction可以检查值是否准备好,如果没有,则将其then/when函数链接以执行其逻辑。
- 能够在指向本地环境的浏览器中设置JavaScript断点
- RubyonRails环境控制器操作JavaScript响应
- 基于环境在Rails中加载不同的Javascript文件
- 我可以用JavaScript判断访问者是否'的语言环境遵循美国风格或世界其他地区's风格
- 在 Java 环境中编译为 javascript 的模板
- 如何将 Node.js 环境变量注入客户端 JavaScript
- JavaScript 引擎和 JavaScript 运行时环境有什么区别
- 如何在节点的沙盒环境中执行用户提交的javascript代码
- javascript如何成为一种同步语言并在浏览器和node.js环境中异步运行
- 关于为JavaScript添加适当的语言环境支持,我目前有什么建议可以遵循吗
- 执行批处理文件的Javascript,该文件包含基于每个会话的环境变量设置
- 引用JS文件所需的Javascript代码取决于Prod、Dev和stage环境
- Firebug 改变了 Firefox 3.6 的 JavaScript 环境
- JavaScript 环境中的安全 ID
- AngularJS过滤器和ng模型如何在JavaScript环境中工作
- iBooks JavaScript环境-无效的元素名称
- 保护javascript环境的最佳方法是什么?
- 创建一个人为缓慢的Javascript环境
- Javascript /环境-如何清除一个对象的所有属性
- Node环境与浏览器javascript环境的区别