我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。
他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下:
var obj = {};
console.log(obj);
obj.foo = 'bar';
// my outcome: Object{}; 'bar';
// The book outcome: {foo:bar};
如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。
虽然它是同步运行的,但它还是出现了。
我运行这段代码是不是错了?console.log实际上是异步的吗?
console.log
不是标准化的,因此行为是未定义的,并且可以很容易地在开发人员工具的各个版本之间进行更改。你的书很可能过时了,我的答案也可能很快就过时了。
对于我们的代码,console.log
是否异步并没有任何区别,它不提供任何类型的回调;并且在调用函数时始终会引用和计算您传递的值。
我们不知道会发生什么(好吧,我们可以,因为Firebug、Chrome Devtools和Opera Dragonfly都是开源的)。控制台将需要将记录的值存储在某个地方,它将在屏幕上显示这些值。呈现肯定会异步进行(限制到速率限制更新),未来与控制台中的日志对象的交互也是如此(比如展开对象属性)。
因此控制台可以克隆(序列化)您记录的可变对象,或者存储对这些对象的引用。第一种方法不能很好地处理深/大的对象。此外,至少控制台中的初始呈现可能会显示对象的“当前”状态,即它被登录时的状态--在示例中,您看到object{}
。
但是,当您展开对象以进一步检查其属性时,控制台很可能只存储了对您的对象及其属性的引用,现在显示它们将显示它们当前(已发生变化)的状态。如果单击+
,您应该可以看到示例中的bar
属性。
下面是一张在bug报告中发布的截图,用来解释他们的“修复”:
因此,有些值可能在记录后很久才被引用,而对这些值的评估是相当缓慢的(“需要时”)。这个差异最著名的例子是Chrome的JavaScript控制台懒得计算数组?
一种解决方法是确保始终记录对象的序列化快照,例如通过执行console.log(json.stringify(obj))
。不过,这只适用于非圆形和相当小的对象。另请参见如何更改Safari中console.log的默认行为?。
更好的解决方案是使用断点进行调试,在这里执行完全停止,您可以检查每个点的当前值。仅对可序列化和不可变的数据使用日志记录。
问题内容: 我意识到这是一个基本问题,但是我在其他地方找不到答案。 是同步还是异步? 万一它是异步的,是否有可能在传播了动作之后添加一个回调,这是可能的? 问题答案: AFAIK,调度动作是同步的。如果您愿意解决异步调用,则可以在redux中使用thunk- middleware ,其中将dispatch作为回调函数提供,您可以根据需要调用它。
null
问题内容: 我对诺言有很多困惑。是同步还是异步? 问题答案: 传递函数 为 无极构造同步运行,但任何依赖于它的分辨率将异步调用。即使promise立即解决,任何处理程序都将异步执行(类似于when )-主线程首先运行到末尾。 不管您的Javascript环境如何,都是如此-无论您是在Node还是浏览器中。
我试图找出如何在事务上下文中正确处理原子级的对Kafka的多次写入。在此场景中,事务不是由kafka消息侦听器启动的,而是通过@Transactional注释以编程方式启动的,请参见下面的代码段。 我使用的是spring boot 2.4.2和spring kafka 2.6.5。 KafkaProducer文档指出,在事务上下文中,不需要调用。get(),因为它最终会在尝试提交事务时引发异常。此
fixedDelay,任务总是等待,直到上一个任务完成。 上面的cron将每五分钟执行一次,我的问题是:@scheduled cron是否会等待前一个任务完成后再触发下一个作业?
问题内容: 我有一张上面有插入触发器的表。如果我从存储过程中的一条插入语句中向该表中插入6000条记录,那么在插入触发器完成之前,存储过程会返回吗? 只是为了确保我在正确地思考,触发器应该只被调用一次(我知道“被调用”不是正确的词)一次,因为只有1个insert语句,对吗? 我的主要问题是:即使触发器尚未完成,存储过程也会完成吗? 问题答案: 您的插入触发器将针对整个插入语句运行一次。这就是为什么