【发布时间】:2018-02-27 22:43:37
【问题描述】:
我试图在网上找到答案,并部分做到了。但是我还是不能完全理解 JS 是怎么跑异步代码的?
我对事物的看法:
JS 赋予我们异步编程的能力。这意味着我们可以开始第一个任务,然后在一个正在进行时我们可以开始第二个任务,等等。 在 js 可以开始第二个任务之前,它应该从上一个任务中释放出来。它可以通过两种方式实现:
- js自己结束任务(只需要js处理的代码)
- js 可以启动例如应该由文件系统处理的任务。在这种情况下,js 完成它的工作,将任务传递给文件系统并开始处理其他排队的任务。当 js 被释放并且文件系统返回结果时,js 可以继续该任务。
所以我们不能仅仅通过编写下一个代码来实现异步:
function doSth( callback ) {
let arr = [];
for ( let i=1e6; i > 0; i-- )
arr.push( i );
callback();
}
doSth( console.log.bind( null, 'I am callback' );
console.log( 'just a line' );
由于 doSth() 只包含 js 的工作,它会先完成然后才出现'只是一行'?所以它不是异步的,对吧? 但是如果我们将文件系统任务插入循环,我们将有异步函数吗?
还有一个问题:promise 真的是异步的吗?它们怎么可能是异步的(我的意思是,其他任务可以在处理承诺时处理),或者承诺只是模仿异步代码? *我知道,还有额外的承诺队列。
也许我只是不明白一些基础?如果你能解释我的问题,让我的问题更明确,我会很高兴。
【问题讨论】:
-
您有权说您发布的代码不是异步的。
-
@Liam,我会重复我的问题(我想,你没有注意到它):我想我现在明白我对异步的含义不正确。异步是否意味着简单地说:“嘿,js,使用这个函数,但你现在不应该对它做任何事情。但是当需要它时调用它”?
标签: javascript asynchronous ecmascript-6 promise asynccallback