JavaScript异步回调使用困惑及底层实现相关疑问
背景与核心困惑
本人具备PIC汇编语言开发背景,这类程序通常持续运行。目前学习JavaScript已有一段时间,但在异步函数调用中作为参数传入的回调函数使用上遇到瓶颈。读了约10本相关书籍后,仍未得到清晰答案。
一、异步函数的底层实现疑问
大多数资料都回避了异步函数在代码中的实际实现方式。我现在明白这通常不属于JavaScript本身,而是底层宿主代码(浏览器、甚至浏览器运行的操作系统)的一部分。但JavaScript肯定有运行非自身语言函数的机制,底层宿主也必须有允许JavaScript继续执行的机制。我从未见过相关代码,想知道宿主代码究竟如何将特定JavaScript代码块放入事件队列中,这方面的信息似乎很少。
二、回调函数使用的实际场景困惑
我曾有一个类比假设,但事实证明是错误的:我正在做饭,需要盐但没有了,于是让朋友去买盐,不想停下做饭。这里的异步函数是goBuySomeSalt(nameOfShop, putItOnTable),我继续做饭,期待盐稍后送到(然后执行putItOnTable()),盐到了就用来做饭。
但JavaScript似乎不允许这样做。几乎所有回调函数的解释都提到回调函数会在异步函数完成后被调用。我想在朋友回来时用盐,但做不到,因为我还在做饭。似乎要等我做完饭才能用到盐——朋友在事件队列末尾等待,只有我做完手头的事,他才会把盐放在桌上,所以我买盐的请求基本没用。
我是不是忽略了什么?能不能在做饭(执行同步代码)期间轮询盐是否送到?能不能在盐送到时得到通知?(注:我已经了解过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!!")
输出顺序
"Please fetch some salt!"
"Cooking"
"Cooking"
"Cooking"
"Cooking"
"finished cooking - but used no salt!!"
"Here's your salt - sorry I'm too late"
内容的提问来源于stack exchange,提问作者SaK

