promise官方源码(promise介绍)
本文目录一览:
- 1、如何优雅处理 async await 错误——解读小而美的 awaitjs 库
- 2、哪些JavaScript 框架的源代码最值得阅读和学习
- 3、微信小程序api怎么promise化
- 4、【node】nodejs promise-mysql 处理事务
- 5、JQuery 的 deferred . promise对象
如何优雅处理 async await 错误——解读小而美的 awaitjs 库
最近有在读一些比较优秀的npm包的代码,起因是感觉自己现在写的代码还是不够规范,不够简洁。
可是我又不知道到底什么样的代码才算是比较 好 的代码,在进行一番思考过后我认为还是要站在巨人的肩膀上。
通过阅读优秀的源码并从中学习如何写出让人觉得赏心悦目的代码最后再写文进行章总结对整个学习的过程进行一个梳理同时分享给其他人。
为什么要在开头写这么多呢?因为我需要为自己坚持下去找一个理由。这样我才能乘风破浪,一往无前。
话不多说,开始总结。
在正式介绍await-to-js这个库之前,让我们先简单的回顾一下有关于在JavaScript这门语言中,异步编程的进化之路。在Promise没出现之前,异步编程一直是困扰着前端工程师的一个大难题,当时的前辈可能会经常看到下面这种代码。
这种同时在纵向和横向延伸的回调中嵌套着回调的代码又被称为 回调地狱 。可见这玩意让人多么恶心,具体来说有以下这几个缺点
Promise是一种 优雅 的异步编程解决方案。从语法上来将,它是一个对象, 代表着一个异步操作最终完成或失败,从语意上来讲,它是承诺,承诺过一段时间给你一个结果。
由于它的原型存在then,catch,finally会返回一个新的promise所以可以允许我们链式调用,解决了传统的回调地狱的问题。
由于它本身存在all方法,所以可以支持多个并发请求,获取并发请求中数据。
有了Promise后,上面的代码可以被写成下面这样。
相比较于上面的回调地狱,使用Promise可以帮助我们让代码只在纵向发展,并且提供了处理错误的回调。显然优雅了很多。不过就算Promise已经这么优秀了,可是依然存在两个每种不足的地方
async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。相较于 Generator , async 函数的改进在于下面四点:
此处总结参考自: 理解async/await[1]
有了async/await,上面的代码可以被改写成下面这样
同时我们可以对每一次异步操作进行错误处理
这样一来上面Promise存在的两个每种不足的地方是不是就被优化了呢?所以说async/await是JS中异步编写的最后解决方案我个人觉得一点问题没有,但是我不知道你看上面的代码,每一次异步操作都要用try/catch进行错误处理是不是感觉不够方便不够智能呢?
作者是这样介绍这个库的
中文翻译过来就是
这里做个简单的对比,之前我们在异步操作中处理错误的方法是这样的
而用了await-to-js之后,我们可以这样的处理错误
是不是简洁多了呢?
作者究竟用了什么黑魔法?
你可能不信,源码只有仅仅15行。
上面这里是TS版的源码,但是考虑到有些同学可能还没接触过TS,我着重分析一下下面这版JS版的源码。
这里我们先抛开errorExt这个自定义的错误文本,核心代码是这样的
可以看出,其代码的逻辑用中文解释是这样的
经过上面的分析我们可以认定,世界上没有什么黑魔法,没有你做不到,只有你想不到。
这里我们再来看函数to的第二个参数errorExt不难发现,这玩意其实就是拿来用户自定义错误信息的,通过 Object.assign 将正常返回的error和用户自定义和合并到一个对象里面供用户自己选择。
源码不可怕,可怕的是自己的面对未知的恐惧感。
敢于面对,敢于尝试,才能更上一层楼。
继续加油,少年。
[1]
:
[2]
How to write async await without try-catch blocks in Javascript:
哪些JavaScript 框架的源代码最值得阅读和学习
RubyLouvre/avalon · GitHub Object.defineProperty的极致使用及各种黑魔法
knockout/knockout · GitHub 观察者模式的极致使用
jakearchibald/es6-promise · GitHub 目前最好的Promise实现
Polymer/observe-js 路 GitHub 强大的状态机与最短编辑长度算法
jquery/jquery · GitHub 最强的DOM兼容处理
以上答案是js大牛(司徒正美)的回答。这是我以前看到保存下来的。
微信小程序api怎么promise化
默认情况下,小程序官方提供的异步API都是基于回调函数实现的,这样就容易造成回调地狱的问题,代码的可读性、维护性差。API Promise化,指的是通过额外的配置,将官方提供的、基于回调函数的异步 API,升级改造为基于 Promise 的异步 API,从而提高代码的可读性、维护性,避免回调地狱的问题。实现API Promise化主要依赖于miniprogram-api-promise这个第三方的 npm 包。首先需要确认已经正确安装了node,使用的开发工具为微信官方的微信开发者工具。
在项目文件夹下对项目进行初始化,执行npm init -y 此时项目文件夹下会创建package.json文件。
执行npm i --save miniprogram-api-promise安装第三方包。此时会在项目根目录下创建node_modules文件夹。
选择 工具--构建npm 等待构建完成点击确定,此时会创建miniprogram_npm文件夹。
在入口文件app.js中按需引入。
import {promisifyAll} from "miniprogram-api-promise"
const wxp=wx.p={}
promisifyAll(wx,wxp)
然后就可以通过wx.p来调用promise化的api。举个例子在test.js文件中
async getTestData(){
const {data:res}=await wx.p.request({methods:'GET',url: '', })
【node】nodejs promise-mysql 处理事务
项目用到了node来做后台服务端,自然避免不了要用redis、sql等等。在mysql中挑了promise-mysql来做,其中的pool连接池用着挺方便的。
但最近的业务需要用上事务,官方文档貌似没有特别的说明。
源码的pool有个getConnection的方法,同时return new PoolConnection
再看看这个PoolConnection,调用了Connection.call(this, null, _connection),说明具有connection的所有功能
便可追进Connection里面看,有beginTransaction,query,commit,rollback,足够我们使用,另外PoolConnection里面还有release方法,保证了pool连接池的不用destroy掉这个connection。
不说废话,直接贴码
JQuery 的 deferred . promise对象
你说的这段描述是对 jQuery(selector).promise()的描述,并不是 jQuery.Deferred() 的描述。
原文是:
Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.
而这段话是说:
jQuery(selector).promise() 函数是返回一个 Promise 对象,这个对象的作用是当绑定到集合【也就是$('div')这样取到的集合】的指定类型的所有动作(promise方法的第一个参数 type ,默认是fx,也就是动画)是否已经完成了。
英文水平有限,有些地方看不怎么懂,这话说得有点乱,不过意思应该是这样的,举个例子:
$('#message')
.animate({width:400, height:240}, 3000)
.promise()
.done(function(){
console.log('animate end');
});
也可以写成:
$('#message').animate({width:400, height:240}, 3000);
var promise = $('#message').promise();
promise.done(function(){
console.log('animate end');
});
这里的 $('#message') 就是所说的collection,
而动画 animate (即 fx)就是 certain type,
里面的所有动作就是 action queue,当然,这里只有1个,就是默认的fx (但是文档中没有找到介绍其它的类型)。
后面的 var promise = xxx 就是指返回的 Promise对象,这个对象在收到animate 方法里面的信号(这个信号包括 resolve, reject, notify, resolveWith, rejectWith, and notifyWith等)可以调用方法done(当然还有不少其它的方法,这里没用到就不说了,自己看文档吧),然后执行done的回调函数了。
animate方法会自己发送promise的信号,不用手动去处理。具体细节可以参考 jQuery.Deferred() 方法,在API的介绍中有这个方法的使用示例。
需要注意的是, jQuery(selector).promise()和jQuery.Deferred().promise()是不一样的。
从目前我知道的来说,jQuery(selector).promise() 是专门用来处理jquery中的动画(animate)使用的,而jQuery.Deferred().promise()使用的范围更广,没看源码,不过猜一下,我觉得 jQuery(selector).promise()是jQuery在动画的时候对jQuery.Deferred().promise()的特殊实现(或者叫做功能封装)。
然后再说一下jQuery.Deferred().promise()吧。它的一般用法为:
var defer= $.Deferred();
$.when(defer.promise()).thendone|fail|....(参数...)
defer.resolve('传参数或留空');
defer.reject('传参数或留空');
defer.notify('传参数或留空');
// ..... 其它信号
实例请自己去看API页面。
上面的defer是一个延迟对象(deferred)引用,表示这个对象的信号会在将来发出。
接下来的 $.when(defer.promise()) 是指jQuery 要监视 defer的信号,收到信号后执行后面的then(或者done, fail或其它)的函数。而后面的defer.resolvereject|notify则是发出信号,通知jQuery延迟调用已经执行了,jQuery收到信号后,就去调用这个延迟的promise()后面的函数。