Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
系统从睡眠模式恢复后的Javascript承诺行为_Javascript_Promise - Fatal编程技术网

系统从睡眠模式恢复后的Javascript承诺行为

系统从睡眠模式恢复后的Javascript承诺行为,javascript,promise,Javascript,Promise,当我的系统休眠并返回到恢复状态时,运行Javascript承诺会发生什么 让我们假设我有一个正在运行的Javascript应用程序,并且有一些承诺正在执行异步工作(如从远程端点请求数据),因此我将操作系统置于睡眠模式,然后离开。过了一段时间,我回来恢复我的系统。在那之后,这些承诺还会继续吗?我是否可以假设他们中的每一个都会被调用“then”或“catch”,或者有可能得到一些永远不会回来的僵尸承诺 如果答案与一些来源一起作为基础,那就太好了=)这与承诺无关 有一些承诺正在执行异步工作(如从远程端

当我的系统休眠并返回到恢复状态时,运行Javascript承诺会发生什么

让我们假设我有一个正在运行的Javascript应用程序,并且有一些承诺正在执行异步工作(如从远程端点请求数据),因此我将操作系统置于睡眠模式,然后离开。过了一段时间,我回来恢复我的系统。在那之后,这些承诺还会继续吗?我是否可以假设他们中的每一个都会被调用“then”或“catch”,或者有可能得到一些永远不会回来的僵尸承诺


如果答案与一些来源一起作为基础,那就太好了=)

这与承诺无关

有一些承诺正在执行异步工作(如从远程端点请求数据)

承诺没有任何作用。承诺只是一种通知机制(而且),它们确实表示异步结果,而不是工作

因此,这取决于你正在做的工作,你得到了对其结果的承诺,以及API(比如你的网络请求)如何处理被操作系统挂起的问题。假设JS运行时的主机对象公开的驱动程序代码或库中没有错误,那么它们应该会得到一个关于取消请求的错误。即使忽略了错误代码,任何合理定义的远程访问API都应该在某个时间点运行到超时,并调用回调,然后解决您的承诺


如果您所说的系统在解决承诺和调用
处理程序之间被挂起,那么
处理程序得到调度,JS运行时负责程序的正常继续。

这与承诺无关

有一些承诺正在执行异步工作(如从远程端点请求数据)

承诺没有任何作用。承诺只是一种通知机制(而且),它们确实表示异步结果,而不是工作

因此,这取决于你正在做的工作,你得到了对其结果的承诺,以及API(比如你的网络请求)如何处理被操作系统挂起的问题。假设JS运行时的主机对象公开的驱动程序代码或库中没有错误,那么它们应该会得到一个关于取消请求的错误。即使忽略了错误代码,任何合理定义的远程访问API都应该在某个时间点运行到超时,并调用回调,然后解决您的承诺


如果您所说的系统在承诺得到解决和
处理程序被调用之间被挂起,那么
处理程序得到了调度,JS运行时负责程序的正常继续。

是的,当然您可能有永远无法解决的承诺。在这里,你有一个永远无法解决的承诺

const promiseThatNeverResolve = new Promise((resolve, reject) => {})
不过,它们是实现错误。。。一般来说,异步活动有一些超时时间来确定承诺的解决或拒绝

在任何情况下,我认为对您提到的场景进行测试并了解发生了什么以及原因是有一定价值的

如果您执行下面的代码,将笔记本电脑置于睡眠状态不到50秒,然后将其唤醒。您将看到Promise resolve OK显示“finished OK”。笔记本电脑能够在睡觉前保存内存的当前状态,并在被唤醒时以相同的状态重新启动。这意味着承诺在挂起状态下保存,并在挂起状态下恢复。节点事件循环、进程等也是如此

但更重要的是。。。如果您等待超过60秒,它将起作用。笔记本电脑醒来时的状态与事件循环、堆栈等(睡觉前的状态)相同,就像一台时间机器,冻结时间并在没有时间流逝时恢复时间。。。所以resolve函数仍计划执行。承诺仍将悬而未决。然后,由于setTimeout的实现,它将调用resolve函数,至少调用一个,无论经过多少时间。如果实现决定抛出异常,那么Promise将被拒绝,您将看到catch()的日志

有趣的是,在唤醒笔记本电脑超过60秒后,又花了10秒才显示出成功的结果。。。可能是在恢复内部内存状态时

const myProm=新承诺((解决、拒绝)=>{
设置超时(解析,50000)
})

myProm.then(()=>console.log('finished OK')).catch(()=>console.log('failed'))
是的,当然你可能会有永远无法解决的承诺。在这里,你有一个永远无法解决的承诺

const promiseThatNeverResolve = new Promise((resolve, reject) => {})
不过,它们是实现错误。。。一般来说,异步活动有一些超时时间来确定承诺的解决或拒绝

在任何情况下,我认为对您提到的场景进行测试并了解发生了什么以及原因是有一定价值的

如果您执行下面的代码,将笔记本电脑置于睡眠状态不到50秒,然后将其唤醒。您将看到Promise resolve OK显示“finished OK”。笔记本电脑能够在睡觉前保存内存的当前状态,并在被唤醒时以相同的状态重新启动。这意味着承诺在挂起状态下保存,并在挂起状态下恢复。节点事件循环、进程等也是如此

但更重要的是。。。如果您等待超过60秒,它将起作用。笔记本电脑醒来时的状态与事件循环、堆栈等(睡觉前的状态)相同,就像一台时间机器,冻结时间并在没有时间流逝时恢复时间。。。所以resolve函数仍计划执行。承诺仍将悬而未决。