应用

加载图片

我们可以将图片的加载写成一个Promise,一旦加载完成,Promise的状态就发生变化。

  1. const preloadImage = function (path) {
  2. return new Promise(function (resolve, reject) {
  3. const image = new Image();
  4. image.onload = resolve;
  5. image.onerror = reject;
  6. image.src = path;
  7. });
  8. };

Generator 函数与 Promise 的结合

使用 Generator 函数管理流程,遇到异步操作的时候,通常返回一个Promise对象。

  1. function getFoo () {
  2. return new Promise(function (resolve, reject){
  3. resolve('foo');
  4. });
  5. }
  6. const g = function* () {
  7. try {
  8. const foo = yield getFoo();
  9. console.log(foo);
  10. } catch (e) {
  11. console.log(e);
  12. }
  13. };
  14. function run (generator) {
  15. const it = generator();
  16. function go(result) {
  17. if (result.done) return result.value;
  18. return result.value.then(function (value) {
  19. return go(it.next(value));
  20. }, function (error) {
  21. return go(it.throw(error));
  22. });
  23. }
  24. go(it.next());
  25. }
  26. run(g);

上面代码的 Generator 函数g之中,有一个异步操作getFoo,它返回的就是一个Promise对象。函数run用来处理这个Promise对象,并调用下一个next方法。