我来自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!!")
输出的顺序是:
"请拿点盐来!" "烹饪" "烹饪" "烹饪" "烹饪" "煮完了--但没有加盐!!" "这是你的盐--抱歉,我来得太晚了"