您的位置:首页 > Web前端 > JavaScript

5、ES6 === 异步 Promise Generator yield

2017-07-20 00:06 453 查看

1、Promise

三种状态:

1、Pending: 等待,处理中,然后:

*、Resolve: 完成

*、Rejected: 拒绝,失败

(()=>{
// 简单理解 Promise
let p1 = new Promise((resolve, reject)=>{
if (异步处理成功了) {
resolve(成功的数据);
}else{
reject(失败的原因);
}
});

p1.then(成功(resolve), 失败(reject)).then(...);
})();

(()=>{

let p1 = new Promise((resolve, reject)=>{
resolve(1);
});

p1.then((value)=>{
console.log('成功了 ==' + value);// 执行: '成功了 ==1'
}, (err)=>{
console.log('失败了');// 不执行
});
})();
(()=>{
// ...
let p1 = new Promise((resolve, reject)=>{
resolve('我是数据');
});

p1.then((value)=>{
return value; // 返回给下一个 then
}, (err)=>{
console.log('失败了: ' + err);// 不执行
}).then((val)=>{
console.log(val); // 执行:"我是数据"
}, (err)=>{
console.log('失败了: ' + err);// 不执行
});
})();
(()=>{
// Promise catch方法
let p1 = new Promise((resolve, reject)=>{
resolve('我是数据');
});

p1.then((value)=>{
console.log(value); // 我是数据
throw '发生错误了';
}).catch((e)=>{
console.log(e); // 发生错误了
});
})();
(()=>{
// Promise all
let p1 = Promise.resolve(3);

let p2 = Promise.reject(5);

// all:只要有一个错误,就报错
Promise.all([p1, p2]).then((value)=>{
console.log(value);
}, (err)=>{
console.log('错误了: ' + err); // 错误了: 5
});
})();
(()=>{
// Promise race
let p1 = new Promise((resolve, reject)=>{
setTimeout(resolve, 500, 'one');
});

let p2 = new Promise((resolve, reject)=>{
setTimeout(resolve, 100, 'two');
});

// race p1,p2谁先执行resolve,就传递谁的数据
Promise.race([p1, p2]).then((value)=>{
console.log(value); // two
});
})();
(()=>{
// Promise resolve
let p1 = Promise.resolve(3);
let p2 = Promise.resolve(p1);

p2.then((value)=>{
console.log(value); // 3
});
})();

2、Generator

生成器 —— 是一个函数,可以遍历

形式上:

a、函数名字前面有 *
b、函数内部使用 yield 语句

(()=>{
// Generator
function* show(){
yield 'Hello';
yield 'World';
yield 'Es6';
}

var res = show();
console.log(res.next()); // 结果是:{ value: 'Hello', done: false }
console.log(res.next()); // 结果是:{ value: 'World', done: false }
console.log(res.next()); // 结果是:{ value: 'Es6', done: false }
console.log(res.next()); // 结果是:{ value: undefined, done: true }
})();
(()=>{
// Generator
function* show(){
yield 'Hello';
yield 'World';
yield 'Es6';
return 'xxx';
}

var res = show();
console.log(res.next()); // 结果是:{ value: 'Hello', done: false }
console.log(res.next()); // 结果是:{ value: 'World', done: false }
console.log(res.next()); // 结果是:{ value: 'Es6', done: false }
console.log(res.next()); // 结果是:{ value: 'xxx', done: true }
console.log(res.next()); // 结果是:{ value: undefined, done: true }
})();
(()=>{
// Generator
function* show(){
// yield语句返回值:undefined
var a = yield 'Hello';
return a;
}

var res = show();
console.log(res.next()); // 结果是:{ value: 'Hello', done: false }
console.log(res.next()); // 结果是:{ value: undefined, done: true }
})();
(()=>{
// Generator
function* fn(){
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
yield 6;
return 7;
}

// for...of 遍历
for(let v of fn()){
console.log(v); // 1 2 3 4 5 6
}
})();
(()=>{
// Generator
let json = {
*show(){
yield 'a';
yield 'b';
return 'c';
}
};
var res = json.show();
console.log(res.next()); // 结果是:{ value: 'a', done: false }
console.log(res.next()); // 结果是:{ value: 'b', done: false }
console.log(res.next()); // 结果是:{ value: 'c', done: true }
})();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息