ES6的异步转换同步

ES6的异步转换同步

关于async/await 范例子 如何将异步代码看起来像同步代码一样

第一种方式
const delayer = t => new Promise(resolve => setTimeout(resolve, t))
async function timestast() {
console.log(1)
await delayer(1000)
console.log(2)
await delayer(1000)
console.log(3)
}
console.log(timestast()) 输出结果是 1 2 3

第二种方式
利用generator函数 他是ES6异步编程的解决方案 next()只会执行一次暂停 必须得加next.done为true的是时候才执行完毕
function run(gFun, …initvalues) {
let gen = gFun(…initvalues)
function next(data) {
let result = gen.next(data)
if (result.done) {
console.log(result)
return
}
result.value.then(data=>next(data))
}
next()
}
const delayer = t => new Promise(resolve => setTimeout(resolve, t))
function* start() {
console.log(1)
yield delayer(1000)
console.log(2)
yield delayer(1000)
console.log(3)

		}
		run(start)	

ES6的异步方法


```javascript
// ES6 Promise .then(方法) 基本用法
function runAsync1() {
				var p = new Promise(function(resolve, reject) {
					setTimeout(function() {
						console.log('异步执行1')
						resolve('成功才执行1')
						
					}, 1500)
				})
				return p
			}
			function runAsync2() {
				var p = new Promise(function(resolve, reject) {
					setTimeout(function() {
						console.log('异步执行2')
						resolve('成功才执行2')
						
					}, 1500)
				})
				return p
			}
			
			runAsync1().then(function(data){
				console.log(data)
				return runAsync2()
			}).then(function(data){
				console.log(data)
				return '自己定义数据'
			}).then(function(data){
				console.log(data)
			})

catch方法
function runAsync() {
var p = new Promise(function(resolve, reject) {
setInterval(function() {
var num = Math.ceil(Math.random() * 10);
if (num <= 5) {
resolve(num)
} else {
reject(num + ‘太大了’)
}

				}, 1500)
			})
			return p
		}
		runAsync().then(function(data) {console.log(data)}).catch(function(error){
		
				    console.log(error);
			})

	race的用法
	方法的效果实际上是「谁跑的慢,以谁为准执行回调」,那么相对的就有另一个方法「谁跑的快,以谁为准执行回调」,这就是race方法,这个词本来就是赛跑的意思。race的用法与all一样,我们把上面runAsync1的延时改为1秒来看一下:
//请求某个图片资源
function requestImg(){
    var p = new Promise(function(resolve, reject){
        var img = new Image();
        img.onload = function(){
            resolve(img);
        }
        img.src = 'xxxxxx';
    });
    return p;
}
 
//延时函数,用于给请求计时
function timeout(){
    var p = new Promise(function(resolve, reject){
        setTimeout(function(){
            reject('图片请求超时');
        }, 5000);
    });
    return p;
}
 
Promise
.race([requestImg(), timeout()])
.then(function(results){
    console.log(results);
})
.catch(function(reason){
    console.log(reason);
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值