我来自PIC汇编语言编程,其中程序通常连续运行.我现在学习JavaScript已经有一段时间了,但当回调函数作为调用Deliverc函数的参数给出时,使用回调函数有点受阻.我确实意识到回调已经被"永远"解释了,但我现在已经从头到尾读了大约10本书,但没有得到明确的答案.

首先,大多数描述都是"掩盖"Inbox函数实际上如何在代码中实现的.我现在明白了,这通常不是JavaScript的一部分,而是底层主机代码(浏览器-甚至可能是浏览器运行的操作系统)的一部分.但JavaScript必须有一种机制来运行本身不属于JavaScript语言的功能,并且底层主机必须有一种允许JavaScript继续的机制.我从未见过任何这样的代码.我想知道主机代码到底如何将特定的JavaScript块放入事件队列中?这一切似乎都保持得相当安静.

当谈到回调的使用时,我有以下假设(通过类比),结果证明这是错误的. 我正在做饭,需要一些盐,但我没有.我派朋友出go 买点盐,但我不想停止做饭.所以我的Inbox函数是goBuySomeSalt(nameOfShop,putItOnTable).我继续做饭,希望盐稍后到达(然后被putOnTable()).当盐到达时,我会用它来做饭.

不过,JavaScript似乎不允许这样做.对回调的解释几乎普遍说callback will be called when the async function has finished.所以当我的朋友回来时我想用我的盐.但我不能,因为我还在做饭.似乎在我完成烹饪之前没有办法使用盐,因为我的朋友就在活动队列的后面等待,只有当我完成正在做的事情时,他们才会把盐放在桌子上. 因此,我对盐的要求本质上是无用的.

我是不是错过了什么?我可以在烹饪过程中"投票"来获取盐吗?盐什么时候到了可以通知我吗? (请注意;我已经读过有关promise 等的内容.)

下面是我的代码来说明这一点:

function a(){
  setTimeout(d, 1000);
  console.log ("Please fetch some salt!")
}

function d(){ console.log("Here's your salt - sorry I'm too late");}

a();

for (let i = 0; i < 4000000000; i++) {
  if (i%1000000000 == 0) { console.log ("Cooking");}
}

console.log ("finished cooking - but used no salt!!")

输出的顺序是:

"请拿点盐来!" "烹饪" "烹饪" "烹饪" "烹饪" "煮完了--但没有加盐!!" "这是你的盐--抱歉,我来得太晚了"

推荐答案

由于它是单线程的,因此您无法像在多线程环境中那样在不使用Web Worker的情况下执行传统的民意调查

Web Worker 设置

将Web worker创建为blob或单独的文件:

console.log("Please fetch me some salt");

function d() {
    console.log("Here's your salt - sorry I'm too late");
}

// Worker script as a string
const workerScript = `
self.onmessage = function(event) {
    if (event.data === 'start') {
        c();
    }
};

function c() {
    for (let i = 0; i < 40000000000; i++) {
        if (i % 500000000 === 0) {
            postMessage("Cooking");
        }
    }
    postMessage("Finished cooking - but used no salt!!");
}`;

// Create a blob from the worker script
const blob = new Blob([workerScript], { type: 'application/javascript' });

// Create a URL for the blob
const workerUrl = URL.createObjectURL(blob);

// Create a new Worker using the Blob URL
const worker = new Worker(workerUrl);

// Send a message to start the worker process
worker.postMessage('start');

// Listen for messages from the worker
worker.onmessage = function(event) {
    console.log(event.data);
};

// Set timeout to simulate delayed function call
setTimeout(d, 400);

Javascript相关问答推荐

我正在使用React-Router-Dom Library来创建不同页面的路由,它正在加载除产品页面外的所有页面

如何在基本计算器中添加不含eval的数学函数

通过JavaScript将CSS与音频大声噪音同步

如何将元素排列得彼此靠近?

我可以后增量超过1(最好是内联)吗?

如何指定1条记录1个表?

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

我试图实现用户验证的reduxstore 和操作中出了什么问题?

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

WebGL 2.0无符号整数输入变量

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

还原器未正确更新状态

在forEach循环中获取目标而不是父对象的属性

将异步回调转换为异步生成器模式

当我try 将值更改为True时,按钮不会锁定

触发异步函数后不能显示数据

自定义图表工具提示以仅显示Y值

通过跳过某些元素的对象进行映射

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

如何在独立的Angular 应用程序中添加Lucide-Angel?