
异步和等待执行?
任何名称都是有意义的,应该先按字面意思取Async是“asynchronous”的缩写,wait可以被认为是“async wait”的缩写因此,应该很好地理解,async用于声明函数是异步的,而away用于等待异步方法完成执行。
还有一个有趣的语法规则,wait只能出现在异步函数中那么一个细心的朋友会有一个问题,如果等待只能出现在异步函数中,这个异步函数应该如何调用呢?
如果您需要等待调用一个异步函数,那么您必须在这个调用之外包装另一个异步函数,然后...进入一个死循环,永远不会有早一天...
如果异步函数不需要等待调用,异步扮演什么角色?
异步做什么
这个问题的关键是异步函数如何处理它的返回值!
我们当然希望它可以通过return语句直接返回我们想要的值,但是如果是这样的话,似乎就没有等待了因此,编写一个代码来尝试看看它会返回什么:
异步函数testasync () {看到输出,突然意识到这是一个承诺对象
c:\ var \ test node-harmony _ async _ away。
承诺{'hello async'}
因此,异步函数返回一个承诺对象该信息也可以从文档中获得。异步函数(包括函数语句、函数表达式、Lambda表达式)将返回一个Promise对象。如果函数中返回了直接数量,异步将通过Promise.resolve()将直接数量封装到Promise对象中
async函数返回一个Promise对象,所以如果最外层不能使用wait来获得它的返回值,当然我们应该使用原始的方法:then()链来处理Promise对象,就像这个
testasync()。然后(v = {现在回头想想,如果异步函数不返回值呢?很容易想象它会返回承诺。解决(未定义)
调用了承诺-无等待的特性,因此如果异步函数在没有等待的情况下执行,它将立即执行,返回一个承诺对象,并且永远不会阻塞下面的语句。这与返回承诺对象的普通函数没有什么不同。
,那么下一个关键点是wait关键字
等待到底是什么?一般来说,away被认为是在等待异步功能完成但是,根据语法,wait是在等待一个计算结果为承诺对象或其他值的表达式(换句话说,没有特殊限制)
因为异步函数返回一个Promise对象,所以wait可以用来等待异步函数的返回值——也可以说wait正在等待异步函数,但是应该清楚它所等待的实际上是一个返回值请注意,wait不仅用于等待承诺对象,它还可以等待任何表达式的结果,因此wait后面实际上可以跟普通函数调用或直接数量。因此,下面的例子可以完全运行
函数get some(){如果它不等待承诺对象,那么等待表达式的结果就是它所等待的
如果它在等待承诺对象,等待将会很忙。它将阻塞下面的代码,等待承诺对象解析,然后获得解析值作为等待表达式的计算结果
被上面的字挡住了...请放心,这就是为什么必须在异步函数中使用wait异步函数调用不会导致阻塞;它内部的所有阻塞都封装在一个承诺对象中,并异步执行
async/away为我们
做了什么来进行简单的比较
上面已经解释了async将它的函数返回值(函数表达式或Lambda)打包到一个Promise对象中,away将等待Promise完成并返回它的解析结果例如,
现在使用setTimeout来模拟耗时的异步操作。首先,让我们看看
函数如何花费很长时间(){位目光敏锐的同学发现takeLongTime()没有被声明为异步事实上,takeLongTime()本身就是返回的承诺对象,无论有没有异步,结果都是一样的。如果你不明白,请回去看看上面的“异步是做什么的?”
的另一个问题出现了。这两种代码在处理异步调用(实际上,处理承诺对象)方面的区别并不明显。即使使用异步/等待也需要编写更多的代码。它有什么优点?
异步/等待的优势在于,在处理当时的链
单个承诺链时,无法找到异步/等待的优势。然而,如果需要处理由多个承诺组成的当时链,优势就可以体现出来(有趣的是,承诺通过当时链解决了多层回调的问题,现在使用异步/等待来进一步优化它)
假设一个服务在多个步骤中完成,每个步骤都是异步的,并且取决于前一步的结果我们仍然使用setTimeout来模拟异步操作:
/**现在使用承诺来实现这三个步骤的处理
functiondoit () {输出结果结果是step 3的参数700 200 = 900()DoIt()依次执行了三个步骤,总共花费了300,500,700 = 1500毫秒,这与console.time()/console.timeEnd()计算的结果一致如果用async/wait实现
,则它将是
async函数doit () {结果与之前的承诺实现相同,但是该代码看起来是否更清晰,几乎与同步代码
相同,甚至更酷
现在,更改业务需求仍然是一个三步过程,但是每一步都需要前一步的结果
似乎与前面的示例没有什么不同,只是执行时间较长!别担心,仔细想想如果它被写成一个承诺会是什么样子。
功能doIt() {