迭代器和promise替换async/await

function awaitDome(){
	return new Promise((r) => {
	setTimeout(function(){
		r(1)
		console.log(1)
	
	},2000)
	}) 
}
async function asyncDome(){
	console.log('await',await awaitDome())
	console.log(2)
}

在这里插入图片描述
如果只有一个异步操作的话很简单

function awaitDome(){
	return new Promise((r) => {
	setTimeout(function(){
		r(1)
		console.log(1)
	
	},2000)
	}) 
}
awaitDome().then(r => console.log(r))

如果是循环或多个的话
假如现在要按照顺序去处理一串数组 如果不同步堵塞执行的话可能和想要不符 比如 小程序的瀑布流 要获取试试的列表高度就需要一个一个添加元素

// 迭代器
var a = [1,2,3,4,5,6,7]
function createIterator(items) {
    var i = 0;
    return {
        next: function() {
            var done = (i >= items.length);
            var value = !done ? items[i++] : undefined;
            return {
                done: done,
                value: value
            };
        }
    };
}
var iteratorDome = createIterator(a)
function awaitDome(i){
	return new Promise((r) => {
		setTimeout(function(){
			r(i)
		},2000)
	}) 
}

function next(){
	var iterator = iteratorDome.next()
	console.log(iterator)
	awaitDome(iterator.value).then(r => {
		console.log(r)
		if(!iterator.done){
			next()
		}
	})
}
next() // 执行结果下面第二张

在这里插入图片描述

在这里插入图片描述
如果直接循环执行的话

var gg = new Date()
var a = [1,2,3,4,5,6,7]
function awaitDome(i){
	return new Promise((r) => {
		
		setTimeout(function(){
			r(i)
			console.log(new Date() - gg)
		},i * 500)
	}) 
}

a.forEach((e) => {
	awaitDome(e).then(r => {
		console.log(r)
	})
})

在这里插入图片描述
上图可见基本500ms执行一次 但是实际想要结果

// 迭代器
var gg = new Date()
var a = [1,2,3,4,5,6,7]
function createIterator(items) {
    var i = 0;
    return {
        next: function() {
            var done = (i >= items.length);
            var value = !done ? items[i++] : undefined;
            return {
                done: done,
                value: value
            };
        }
    };
}
var iteratorDome = createIterator(a)
function awaitDome(i){
	return new Promise((r) => {
			
		setTimeout(function(){
			r(i)
			console.log(new Date() - gg)
		},i * 500)
	}) 
}

function next(){
	var iterator = iteratorDome.next()
	console.log(iterator)
	awaitDome(iterator.value).then(r => {
		console.log(r)
		if(!iterator.done){
			next()
		}
	})
}
next() // 执行结果下面第二张

在这里插入图片描述
因为平时调用接口是数据返回的顺序是异步的 当我们想要按照顺序返回时就要同步按照顺序调用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值