天天看点

rxjs请求依赖并发-小案例

/*
请求依赖并发
描述:发起一个用户登录请求,成功后再发送3个查询请求(资料,邮件,消息),最后将结果合并输出结果。
 */
const loginRequest = new Promise((resolve, reject) => {
  setTimeout(function () {
    resolve({sessionId:'xxx-xxx-xxx'})
  }, 2000);
});
const queryInfoRequest = function (sessionId) {
  return new Promise((resolve, reject) => {
      setTimeout(function () {
        resolve({
          id:1,
          nickName:'lake'
        })
      }, 1500)
    }
  )
};
const queryEmailRequest = function (sessionId) {
  return new Promise((resolve, reject) => {
      setTimeout(function () {
        resolve([
          {id:1,title:'hi',content:'I miss you'},
          {id:2,title:'are you there',content:'how are you doing'}
        ])
      }, 1000)
    }
  )
};
const queryMessageRequest = function (sessionId) {
  return new Promise((resolve, reject) => {
      setTimeout(function () {
        resolve([
          {id:1,type:'TEXT',content:'I am ok'},
          {id:2,type:'TEXT',content:'yeah'}
        ])
      }, 1000)
    }
  )
};
const oldTime = new Date().getTime();
// 四个接口同时发起请求
combineLatest(from(loginRequest),from(queryInfoRequest('aa')),from(queryEmailRequest('aa')),from(queryMessageRequest('aa'))).subscribe(item => {
  console.log("总运行时长:"+(new Date() - oldTime));
  console.log(item)
})

// // 结果:
// //   [
// //     { id: 1, nickName: 'lake' },
// //     [{ id: 1, title: 'hi', content: 'I miss you' },{ id: 2, title: 'are you there', content: 'how are you doing' }],
// //     [{ id: 1, type: 'TEXT', content: 'I am ok' },{ id: 2, type: 'TEXT', content: 'yeah' }]
// //   ]
// // 总运行时长:2003

// 登录接口完成后,再请求另外的三个查询接口
from(loginRequest).pipe(
  switchMap(sessionId=>{
    return [
      from(queryInfoRequest(sessionId)),
      from(queryEmailRequest(sessionId)),
      from(queryMessageRequest(sessionId))
    ]}),
  combineAll()
).subscribe(item =>{
  console.log(item);
  console.log("总运行时长:"+(new Date() - oldTime));
})

// // 结果:
//   [
//     { id: 1, nickName: 'lake' },
//     [{ id: 1, title: 'hi', content: 'I miss you' },{ id: 2, title: 'are you there', content: 'how are you doing' }],
//     [{ id: 1, type: 'TEXT', content: 'I am ok' },{ id: 2, type: 'TEXT', content: 'yeah' }]
//   ]
// 总运行时长:3501