RxJs:Web请求的顺序。什么';这是一个比我的更好的解决方案?

RxJs:Web请求的顺序。什么';这是一个比我的更好的解决方案?,rxjs,rxjs5,Rxjs,Rxjs5,我有一个由N个(整数)URL组成的数组。我想提出网络请求 要求 更新状态:我们开始发出web请求 要求一个接一个 在每个web请求之前,我们更新要调用的URL的状态 更新状态:完成(收到所有URL后) 我想发出以下事件 从URL开始 Emit:String:启动web请求 循环开始(URL应该一个接一个地加载,而不是一次全部加载。数据一收到就发出) 发出:字符串:加载url N[i] Emit:Object:url N[i]的数据 环端 发射:字符串:完成 以下是我的解决方案。我正在

我有一个由N个(整数)URL组成的数组。我想提出网络请求

要求

  • 更新状态:我们开始发出web请求
  • 要求一个接一个
  • 在每个web请求之前,我们更新要调用的URL的状态
  • 更新状态:完成(收到所有URL后)
  • 我想发出以下事件

    • 从URL开始
    • Emit:String:启动web请求
    循环开始(URL应该一个接一个地加载,而不是一次全部加载。数据一收到就发出)

    • 发出:字符串:加载url N[i]
    • Emit:Object:url N[i]的数据
    环端

    • 发射:字符串:完成
    以下是我的解决方案。我正在寻找更好的解决办法

    我的代码有问题

  • url末尾添加了null
  • Subscribe事件必须处理不同类型的数据,这意味着我必须添加ifs来猜测触发了哪个事件。例如,如果订阅中的res是字符串,则它必须是status。如果它的空序列必须已经结束

  • 我正在寻找更好的解决办法。请提出建议。

    假设我正确理解了您的问题,可能的解决方案是:

    const { Observable } = Rx;
    
    // fake http request
    function fakeWebrequest(url){
        return Observable
            .of(`RESPONSE: of: ${url}`)
            .delay(500);
    }
    
    
    const urls = ['url 1','url 2'];
    
    let requests$ = Observable.from(urls.map(url => fakeWebrequest(url)));
    
    requests$
      .concatAll()
      .subscribe(
        // next
        res => {
          console.log(res)
        },
        // error
        _ => {},
        // complete
        _ => console.log('All requests ended')
      );
    
    输出如下:

    RESPONSE: of: url 1
    RESPONSE: of: url 2
    All requests ended
    

    它有两个问题。a> 一次发出所有web请求。b> 在发出web请求之前,我们将如何发出状态?因为不会一次发出所有请求。尝试在延迟之前将console.log放入do中。它只是创造了一个冷的可观测的,而不是马上触发的。你说的地位是什么意思?如果您想在每个请求之前记录类似“获取${url}的请求已启动”的内容,请将其放在do和console中。在(RESPONSE:of:${url}
    )的
    响应之前记录它。
    将控制台放在您的
    fakeWebrequest
    中,您将发现它立即被调用。我所说的
    status
    是指在发出每个web请求之前发出一个带有字符串的事件。您可以检查我的JSBIN链接,并尝试模拟相同的行为。JSBIn现在已关闭,因此您可能需要称重。该函数立即被调用:YES。但它只是返回一个可观察的。实际上,我可以想象,你将使用http.get(“…”)
    或post、put等,而不是
    Observable.of
    ?好的,angular使用一个observable,在您订阅它之前,您的请求不会被触发。关键是,您“准备”了请求,但没有发出请求。是的,调用了函数,但没有立即调用可观察的“body”,而是按顺序为每个url调用-everythig都可以:)。这里是我的例子:
    let requests=this.meta.gallery2DImageFiles.map(photo=>{返回this.interiorService.uploadGallery2DImage(interiorId,photo.file);//这里创建了角度http observable});push(新的可观察对象(photo=>{…}));req.concatAll().subscribe(…)
    RESPONSE: of: url 1
    RESPONSE: of: url 2
    All requests ended