1

设置: 嗨。我正在尝试学习创建/实例化对象。我在想我应该能够创建多个对象,这些对象可能具有不同数量的类似作品(例如收集新闻文章),并且无论创建的顺序如何,都会“报告完成”。到目前为止,我对此还不清楚,所以这是一个基本示例,后面是所述问题:

function test(count){
    this.count = count;
    for(var i = 0; i< count; i++){}
    console.log(i);
}

new test(1000);
new test(10);

实际问题:

根据上面的代码,我希望第二个实例首先打印,但事实并非如此。设置它的正确方法是什么,以便哪个对象完成其工作将首先打印?

*修改我的问题* 对不起......我真正想问的是如何设置对象以具有更多的异步行为。我是 Stack 的新手,所以如果我应该关闭/移动这个问题,请告诉我。

4

4 回答 4

1

您没有创建不同的并行执行线程:第一个线程test(1000)在下一行开始之前完全执行。

在 Javascript 中,当您不使用 webworkers(您可能不应该使用)时,您的所有代码始终在单个线程中执行。该线程由浏览器根据事件唤醒,并在浏览器调用的函数返回时重新进入睡眠状态。

请注意,即使使用线程,即使在自然并行的语言中,您也几乎无法保证什么循环首先结束。

于 2013-01-26T09:12:05.457 回答
1

一般来说,JavaScript 是使用同步执行模型,即事件队列。所有调用都放在这里,基本上是按照它们在源代码中出现的顺序(尊重它们所在的范围)。

因此,如果您启动某个功能,则在该功能完成之前不会执行任何其他操作。在您的情况下,您将两个调用都放在事件队列中,但第二个调用只会在第一个调用完成后执行。

但是,也有例外:WorkerAJAX 请求

这里的执行在通常的事件队列之外,您可以在执行完成后使用消息处理程序或回调来使用结果。但是,在大多数情况下,您无法确定调用的完成顺序,因为有很多情况会影响执行顺序(网络延迟、cpu 使用率等)。

就您而言,无论如何,您似乎都想加载外部资源。所以看看 AJAX 是如何工作的。

于 2013-01-26T09:12:30.707 回答
1

第二个实例不先打印的原因是第一个调用new test(1000)在下一行new test(10)开始执行之前运行完成。

如果您希望第二个调用首先运行,请交换两行...

编辑:顺便说一句,任何体面的编译器都会完全删除这一行:

for(var i = 0; i< count; i++){}

所以你甚至不能指望第一个电话比第二个电话花费更多的时间......

于 2013-01-26T09:12:51.167 回答
1

只有在第一个对象被实例化后,第二个实例才会被实例化。
所以它首先打印 1000 之后new test(10)
因为它是单线程程序

于 2013-01-26T09:13:02.440 回答