javascript异步函数的开发
2023-11-24 12:26:04
异步Javascript的演进梳理了Javascript异步函数的开发过程。首先,它通过实现异步回调函数,然后经历了诺言/ +和发电机的功能,并在未来的异步功能。由于景壮的这篇文章的翻译,这是如下: 现在,让我们回顾一下多年来Javascript异步函数的发展。 回调函数回调 似乎一切都应该从回调函数开始。 异步Javascript 我们都知道,在Javascript中,异步编程风格只有公民能作用于Javascript语言来完成的:这意味着我们可以把一个函数作为另一个函数的参数,在这个函数可以在函数调用中传递(即回调函数)。这就是为什么回调函数:如果你是天生的将一个函数作为另一个函数的参数(当它被称为一个高阶函数),然后你就可以调用这个函数内部的函数来完成相应的任务。回调函数不返回值(不要尝试使用返回),仅用于在函数执行某些操作。看看一个例子: Something.save(功能(ERR){) 如果(错误){ 错误处理 返回;没有返回值 } console.log(''成功'); }); 在上面的例子中,我们展示了一个错误,第一次回调与错误的优先级,这是一个对Node.js本身的特点。所有的核心模块在Node.js和大多数模块在NPM仓库将遵循这一特征的时候写的。 过度使用回调函数的挑战: 如果你不能合理地组织代码,那么很容易引起回调,这使得你的代码很难被别人理解。 很容易忽略错误处理代码。 不能使用返回语句返回值,不能使用抛出关键字。 正是由于这些原因,Javascript世界一直在寻找可行的解决方案,从而使得异步Javascript的开发变得更加简单。 其中的一个可行的解决方案是异步模块。如果你做生意和回调函数打了很长一段时间,你会深深地感到,在Javascript中如果你想让事情并行或串行实现,即使使用异步函数映射(映射)使用异步函数的数组元素更加复杂。所以,谢谢Caolan McMahon写的异步模块来解决这些问题。 与异步模块,你可以按下面的方式写代码: Async.map({ 1, 2, 3 },AsyncSquaringLibrary.square, 函数(错误,结果){ 将是结果{ 1, 4, 9 } }); The async module, to some extent, has brought convenience, but it is still not easy enough and the code is not easy to read, so Promise appears. 承诺 目前Javascript异步标准可以追溯到2012,它没有成为直到6。然而,长期的承诺不通过Javascript社区发明的。这个词来自Daniel P.friedman在1976发表的一篇文章。 承诺表示异步操作的最终结果。 现在我们使用承诺来完成上面代码所完成的任务,并且承诺样式代码如下所示: Something.save() 然后(函数(){()) console.log(''成功'); }) catch(函数(){()) 错误处理 }) 在回调中,回调函数也被使用,在catch和catch方法中引入回调函数,分别在承诺满足和拒绝时执行,另一个优点是它可以链接完成一系列的任务: SaveSomething() 然后(updateotherthing)。 然后(deletestuff)。 然后(logresults); 当你没有一个现成的承诺,你可能需要使用一些承诺的图书馆,和一个受欢迎的选择是使用蓝鸟。这些图书馆可以提供的功能比本地解决方案的更多,不限于受许指定的功能/ +标准。 但是你为什么不使用糖的方法呢建议您先阅读承诺这篇文章:扩展问题。 您可能会问:如果大多数库只公开回调接口,那么如何使用诺言呢 这是非常简单的,此时惟一需要做的就是使用回调函数包装回调函数: 代码的回调样式可能如下所示: 功能savetothedb(值){ Db.values.insert(价值、功能(呃,用户){ 如果(错误)抛出错误; 将用户插入到: }); } 现在我们将它转换为支持承诺样式调用的代码: 功能savetothedb(值){ 返回新的承诺(函数(解析,拒绝){ Db.values.insert(价值、功能(呃,用户){ / /记住错误第一;) 如果(错误){ 返回拒绝(错误);请不要忘记返回这里。 } 解析(用户); }) } } 已经有两种方式来支持回调风格的同时提供相当数量的库或框架,保证风格的API接口。所以现在,如果你想去外面的世界提供了一个图书馆,最好的做法是同时提供两个接口。你可以用以下方式为了实现这一目标: 函数(CB){ 如果(CB){ 返回CB(); } 返回新的承诺(函数(解析,拒绝){ }); } 或者更简单,你可以从界面,只提供承诺的风格开始,和使用像callbackify工具实现向后兼容性的目的。事实上,Callbackify也同样是上面的代码片段,但它采用更一般的方法实现。我建议你读callbackify源代码。 发电机发电机/产量 Javascript生成器是一个相对较新的概念,这是6新功能(也被称为es2015)。想象这样一个场景: 当你执行一个函数时,你可以在某个时刻暂停函数的执行,然后做一些其他的工作,然后返回这个函数,继续执行,甚至执行一些新的值,然后继续执行。 上面描述的场景正是Javascript函数发生器是专门的问题。我们称之为发电机的功能时,它不会立即执行,但需要我们进行迭代操作(接法)手动,你调用生成函数,它返回给你一个迭代器迭代器遍历每个休息点。 函数*(){ var指数= 0; 当(索引< 2){ 收益率指数+ /暂停功能,收益率操作后 } } var(bar);返回实际上是一个迭代器。 Console.log((酒吧。下)); / / { 0 },价值:假 Console.log((酒吧。下)); / / { 1 },价值:假 Console.log((酒吧。下); / /定义):{ },真正的价值: 此外,如果您希望使用生成器函数更容易编写异步Javascript代码,我们可以使用联合库。CO是著名的TJ神写的。 公司是一个基于发电机Node.js和浏览器的过程控制工具。有了承诺,您可以以更优雅的方式编写非阻塞代码。 使用前面示例代码的CO,我们可以使用以下代码重写: 函数(*){() Yield Something.save(); }。然后(函数(){) 成功 }) catch(函数(错误){) 错误处理 }); 你可能会问:你如何并行操作答案可能比你想象的要简单,如下所述(实际上是承诺): { something.save产量(),Otherthing.save()}; 异步/等待 异步函数的概念引入ES7(尚未正式标准化)。如果你想使用它,你可以把它变成ES5代码语法转换器通天手段。(提醒:我们现在谈论的是async关键字,而不是在NPM异步封装)。 总之,与异步关键字,你可以很容易地实现所做的工作,在使用发电机和有限的功能。当然,除了黑客。 也许你会问,如果产量不如果你在ES7具有异步关键词如此重要 事实上,异步使用收益率只是一个漏洞,收益率意味着懒惰的顺序(懒惰的序列)和迭代器。首先,让产量使用它的最初用途,然后使用等待执行异步操作。 在这背后,异步功能实际上使用的承诺,这就是为什么异步函数返回一个承诺。 因此,我们使用异步函数做的工作是类似以前的代码,你可以重写代码,用下面的方法: 异步功能保存(某物){ {试 等待(保存某物);等待等待后面的代码执行,类似于收益率。 } catch(前){ 错误处理 } console.log(''成功'); } 你可以看到,使用异步功能,你需要在函数声明的前面加上异步的关键。之后,您可以使用等待函数内的关键词,这是类似于以前的产量。 使用异步函数来完成并行任务是学会非常相似。唯一不同的是,promise.all不再隐。 异步功能保存(某物){ 等待的承诺。所有{ Something.save()()、Otherthing.save()} } 膝关节骨性关节炎也支持异步功能,如果你使用的是膝关节骨性关节炎,现在你可以使用这个功能与巴别塔的帮助。 从进口膝关节骨性关节炎膝关节骨性关节炎; 让应用程序= KOA(); app.experimental =真; app.use(异步函数(){) this.body =等待promise.resolve(读者你好!!) }) (3000)app.listen; 以上内容共享javascript异步函数开发过程,希望对您有所帮助。tag:函数 异步 电脑软件 Javascript
相关内容