ajax异步回调传值,js最好怎么在两个AJax异步操作之后执行一个新的操作

你的问题是有三件事 a,b,c。c要在a和b结束之后再执行。

有很多方法: 比如你说的嵌套法 还有暴力监听法

这个问题我曾经考虑过,以下是我的解答。

异步发射器

用数组保存如何执行异步操作

注意里面的函数都有个参数 commit ,它是一个函数 用来回传值。 当ajax成功的时候 把返回值回传进去就好

// 两个异步操作

var todos = [

function getUser(commit){

setTimeout(() => {

commit({ // 这里是异步结束的时候 利用 commit 把值回传

name: 'eczn',

age: 20

}, 233);

});

},

function getLoc(commit){

setTimeout(() => {

commit({

area: '某个地方'

});

}, 333);

}

];

编写发射器

processors 是 todos 这样的数据。 cb 是最终回调。

function launcher(processors, cb){

var o = {};

var count = 0;

if (processors.length === 0) cb(o);

processors.forEach((func, idx) => {

func(function commit(asyncVal){ // 这就是commit函数

// 把 asyncVal 的所有属性合并到 o 上

// ( 利用 Object.keys 获取对象全部属性名 )

Object.keys(asyncVal).forEach(key => {

o[key] = asyncVal[key];

});

// 计数器自加

count++;

// 如果发射器全部发射完毕则调用回调函数 cb 并把 o 作为参数传递

if (count === processors.length) cb(o);

});

});

}

并发他们

执行异步发射器 并提供 最终回调

launcher(todos, function(whereEczn){

// todos 里面存放的异步操作的值由 commit 回调返回

// 全部回调跑完的时候 就会执行当前这段函数 并把期望值返回

console.log(whereEczn);

// 按顺序输出

['name', 'area'].forEach(key => {

console.log(`${key}: ${whereEczn[key]}`);

});

});

bVOg0X?w=514&h=254

Link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值