0.0.2 • Published 8 years ago

thenablejs v0.0.2

Weekly downloads
2
License
ISC
Repository
github
Last release
8 years ago

Thenable.js: another Promise

项目的初衷,是抱着学习的目的,去了解、认识Promise的特性,顺路按照个人的习惯,改编了一份属于自己的 "Promise" 对象

除了仿制了 Promise 大部分特性外,还添加了 整合 其他 promise/a 规范的小小功能,像 Promise 和 jQuery.Deferred 等,终于能愉快一起玩耍啦,有情人终成兄妹~~~

初始化

熟悉 Promise 对象的同学,可这么用:

var thenable = new Thenable(function(resolve, reject) {
 resolve('normal');
});

thenable.then(function(data) {
  // data === 'normal'
});

个人偏向这么用:

var thenable = new Thenable();
thenable.then(function(data) {
  // data === 'normal'
});
thenable.resolve('normal');

两者等价

API

1. thenable.resolve(any: All)

触发状态 "resolved",进入 then 的 resolved 相关回调done部分。 如果 thenable.resolve(obj) 中,obje是一个 promise/a 规范的对象【肯定也可以 resolve 一个 Thenable 对象,必须的】,那么,将等待 obj 完成后,才会继续往下执行

举个例子:

var thenable = new Thenable();
thenable.resolve(new Promise(function(resolve){
  setTimeout(function(){
    resolve('normal');
  }, 1000);
}));

thenable.then(function(data) {
  // 等待1秒后,执行
  // data === 'normal'
  console.log(data);
});

2. thenable.reject(any: All)

触发 "rejected" 状态,进入 then 和 catch 中相关的回调fail部分 如果 reject 一个 promise/a 规范对象,并不会等待此对象执行完毕。

3. thenable.then(done: Function, fail: Function)

done: Function 状态为 resolved 时的回调 fail: Function 状态为 rejected 时的回调,相当于设置了一个 catch 的回调。

如果 then 的任意一个回调函数,无论是 done 和 fail,返回的是 promise/a 规范的对象,都会等待此对象的更变,而决定链条接下来的状态。

var thenable = new Thenable();
thenable.resolve('normal');

thenable.then(function(data) {
 // data === 'normal'
 console.log('1. ' + data);
}, function() {
  console.error('不会进入此逻辑');
})
.then(function(data) {
  // 因为上面的 then,没有设置 return
  // data === undefined
  console.log('2. ' + data);
  return 'hi';
})
.then(function(data) {
  // 上一个函数,有 return 的值
  // data === 'hi'
  console.log('3. ' + data);
})
.then(function() {
  // 与其他 promise/a 规范混合使用
  return Promise.reject('error');
})
.catch(function(data) {
  // 上一个 Promise 对象,reject 了 'error'
  // data === 'error'
  console.log('4. ' + data);

  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve('success');
    }, 1000);
  });
})
.then(function(data) {
  // 等待 catch 中的逻辑完成,然后1秒后输出
  // data === 'success'
  console.log('5. ' + data);
});


// 开始第二条链
thenable.then(function(data) {
  // 此链条,代表重新开始,获取到 resolve 设置的值
  // data === 'normal'
  console.log('第二轮:' + data);
});

4. thenable.catch(fail: Function)

等价于 thenable(null, fail: Function)