oss js sdk 异步架构改造

### 背景
随着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调用栈
oss js sdk 异步架构改造
可以看出: 调用栈非常不清晰,太多没有用的 co 相关的调用栈。如果 n 个 generator 层层嵌套,就会出现 n 倍的 (anonymous)->onFullfiled->next->toPromise->co->Promise->(anonymous) 调用栈。如果你读过 co 的源码可能知道,这是 co 将 generator 解包的过程。其实这个可以通过 yield generator -> yield* generator 来解决。
async调用栈
oss js sdk 异步架构改造
可以看出: 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反馈问题
上一篇:解读阿里云内容协作平台-增值服务


下一篇:针对租户的用户分层和权益设计(相册与网盘服务)