JS 中的 Promise 允许你进行异步编程,如下所示:
DoSomething().then(success, failure);
DoSomethingElse();
每当我编写前面的代码时,它会在到达DoSomethingElse()
之前到达success
。这怎么可能?JS 不是单线程环境(不包括 web-workers)吗?完成了setTimeout
吗?
JS 中的 Promise 允许你进行异步编程,如下所示:
DoSomething().then(success, failure);
DoSomethingElse();
每当我编写前面的代码时,它会在到达DoSomethingElse()
之前到达success
。这怎么可能?JS 不是单线程环境(不包括 web-workers)吗?完成了setTimeout
吗?
是的,JavaScript 是单线程的,这意味着你永远不应该阻塞这个单线程。任何长时间运行的等待操作(通常是 AJAX 调用或休眠/暂停)都是使用回调实现的。
如果不看这里的实现,会发生什么:
DoSomething
被调用,它接收success
并failure
作为参数起作用。
它做它需要做的事情(可能启动长时间运行的 AJAX 调用)并返回
DoSomethingElse()
叫做
...
一段时间后 AJAX 响应到达。它调用先前定义success
的failure
函数
JavaScript 中的 Promise 通常涉及某种调用链或流式方法调用 API,其中函数结果通常提供延续方法,例如 with、then、when、whenAll 等,以及一些指示结果是否实际上可用的状态标志。具有输入参数的函数还可以支持承诺值,检测输入是一个承诺,并将其功能封装到一个 thunk 中,当承诺值准备好时,可以将其链接起来。
有了这些,您可以提供一个环境,其中 Promise 模拟这样的并行语言:
MyApi.LongRunningTask().then( function(result) { MyAppi.LongOtherTask(result); }).then
或长时间运行的调用不依赖的顺序用例:
var value1 = MyApi.LongRunningTask();
var value2 = MyApi.LongRunningOtherTask();
MyApi.DoSomeFunction(value1, value2).then ==> DoSomeFunction 可以检查值是否准备好,如果没有则链接它们的 then/when 函数以执行其逻辑。