### 背景
随着js的技术变革,es6/7的语法的慢慢普及,并且很多的sdk都开始对新的异步进行支持,因此我们也在开始进行调研,总结目前sdk存在的问题:
- oss js sdk目前的异步api需要依赖第三方库co
- api的调用栈很不清晰,定位问题困难,只要是因为这个co库
- 对于then的异步方式需要一个wrapper来处理
- issue上反馈了很多用户的诉求
### 结构变化
- 所有的对外暴露的api方法 由之前的
function*
转变为async function
- 需要使用
yeild
的地方均由await
代替 - 底层异步全部统一使用
Promise
/async await
形式 - 修改了部分bucket相关的api方法参数, 详情参考readme
### 改进点
#### 1.使调用栈变得清晰,方便问题的排查。
co调用栈
可以看出: 调用栈非常不清晰,太多没有用的 co 相关的调用栈。如果 n 个 generator 层层嵌套,就会出现 n 倍的 (anonymous)->onFullfiled->next->toPromise->co->Promise->(anonymous) 调用栈。如果你读过 co 的源码可能知道,这是 co 将 generator 解包的过程。其实这个可以通过 yield generator -> yield* generator 来解决。
async调用栈
可以看出: asyncWrap 中调用了 B 函数,B 函数调用了 A 函数,A 函数中 resolve 了一个值。asyncWrap 中还调用了 stopProfiling 函数。
2.去除了co以及相关的依赖
- 减少了包的大小, 降低了1~2M
- 简化了使用
3.回归原生实现方式,兼容性更好
- 完全按照js es6/7的标准进行的封装
- 大部分主流浏览器都已经支持
4.初始化client不再需要一个wrapper,直接进行初始化即可
### 使用方式
举个最常用的上传api使用例子,分片上传
const oss = require('ali-oss');
const store = oss({
accessKeyId: 'your access key',
accessKeySecret: 'your access secret',
bucket: 'your bucket name',
region: 'oss-cn-hangzhou'
});
//async function 进度回调
async function asyncProgress(p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers['x-oss-request-id']);
}
// 第二个参数是File|Blob
store.multipartUpload('object', 'local-file', {
progress: asyncProgress
}).then((result) => {
console.log(result);
});
//function 进度回调
function progress(p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers['x-oss-request-id']);
}
// 第二个参数是File|Blob
store.multipartUpload('object', 'local-file', {
progress: progress
}).then((result) => {
console.log(result);
});
还有其他相关api使用请参考我们的官方文档
### 写在最后
- 我们会持续跟进js的新技术,选择适合我们的技术并应用到sdk中去。
- 欢迎随时到github中提issue反馈问题。