4

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

DoSomething().then(success, failure);

DoSomethingElse();

每当我编写前面的代码时,它会在到达DoSomethingElse()之前到达success。这怎么可能?JS 不是单线程环境(不包括 web-workers)吗?完成了setTimeout吗?

4

2 回答 2

5

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

如果不看这里的实现,会发生什么:

  1. DoSomething被调用,它接收successfailure作为参数起作用。

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

  3. DoSomethingElse()叫做

  4. ...

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

另见(类似问题)

于 2012-03-18T11:58:58.893 回答
0

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 函数以执行其逻辑。

于 2012-03-18T12:32:07.700 回答