如何在javascript中实现异步编程(promise)?是't javascript是一个ui线程环境

how is async programming (promises) implemented in javascript? isn't javascript a ui-threaded environment?

本文关键字:javascript 环境 线程 ui 一个 实现 异步 promise 编程      更新时间:2023-09-26

JS中的Promises允许您进行异步编程,如下所示:

DoSomething().then(success, failure);
DoSomethingElse();

每当我写入前一个代码时,它在到达success之前到达DoSomethingElse()。这怎么可能?JS不是一个单线程环境吗(不包括web工作者)?setTimeout完成了吗?

是的,JavaScript是单线程的,这意味着您永远不应该阻塞这个单线程。任何长时间运行的等待操作(通常是AJAX调用或睡眠/暂停)都是使用回调实现的。

如果不考虑实现,就会发生以下情况:

  1. CCD_ 4被调用并且它接收CCD_ 5和CCD_。

  2. 它做它需要做的事情(可能启动长时间运行的AJAX调用)并返回

  3. DoSomethingElse()被称为

  4. 。。。

  5. 一段时间后AJAX响应到达。它调用先前定义的successfailure函数

另请参阅(类似问题)

  • 等效于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函数链接以执行其逻辑。