账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    rxjs 如何才能等上一个执行了complete才执行下一个
    61
    0
            let blockPut = ((idx) => {
              // return new Promise(resolveItem => {
                return this.http.request(req).pipe(t => {           
                  return t;
                }).pipe(
                  map(event => {
                    let loadSize = this.uploadedSize(event, block.size);
                    uploadSize[idx] = loadSize;
                    let totalUploadSize = 0;
                    uploadSize.forEach(itemSize => {
                      totalUploadSize += itemSize;
                    });
                    let percent = Math.floor(totalUploadSize/totalSize * 100).toFixed(2);
                    val.processChange(Number(percent));
                  })
                )
            })(i);
            obsVals.push(blockPut);
          }
          from(obsVals).pipe(mergeMap(t=>{
            console.log(t);
            return t;
          },1)).subscribe(res => {
    
          }, err => {
            console.error(err);
            val.complete(false);
          }, () => {
            val.complete(true);
            resolveGroup();
          });

    本来一版情况下这个都是一个一个的执行,但是这个上传文件中blockPut这个Observable.subscribe(func1, err, complete);中func1其实文件并未传完就调用了,导致mergeMap直接开始可下一个。
    这个如何是好?
    求帮助

    2
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 少女与猫。 普通会员 1楼

      在 RxJS 中,你可以使用 raceswitchMap 方法来等待另一个任务完成。但是,如果你想在另一个任务完成之前执行下一个任务,你需要使用 forkJoin 方法。

      以下是一个使用 forkJoin 的示例:

      ```javascript import { forkJoin } from 'rxjs';

      // 创建一个任务列表 let tasks = [ // 执行任务1 (async () => { await new Promise(resolve => setTimeout(resolve, 1000)); // 执行任务2 setTimeout(() => { console.log('Task 2 finished'); }, 2000); }), // 执行任务3 (async () => { await new Promise(resolve => setTimeout(resolve, 1500)); // 执行任务4 setTimeout(() => { console.log('Task 4 finished'); }, 3000); }), ];

      // 使用 forkJoin 来等待所有任务完成 let tasksResult = forkJoin(...tasks);

      // 打印任务列表 tasksResult.forEach(task => { console.log(task); }); ```

      在这个示例中,我们首先创建了一个任务列表,然后使用 forkJoin 来等待所有任务完成。forkJoin 的第一个参数是一个包含所有任务的数组,第二个参数是一个回调函数,这个函数将在所有任务完成后被执行。

      注意,forkJoin 会等待所有任务完成后,然后返回一个包含所有任务结果的对象。如果你希望等待每个任务完成后才执行下一个任务,你可以修改回调函数来等待每个任务完成。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部