2017-07-29 6 views
0

私はreactiveXを初めて使っています。これは愚かな質問かもしれません。 私は1つのメソッド呼び出しの中で次々に2つの操作を組み合わせようとしています。RX Javaコンポジションロジック

ステップ1

ステップ2は、これらの詳細に基づいてデータをフェッチするデータのいくつかの詳細を取得し、それらの詳細を格納することです。私が理解することはできませんよ何

public Observable<ApiResponse> getData(String id, String token) 
{ 
    //step 1 
    apiInterface.fetchDataDetails(id) 
      .map(new Func1<Map<String, String>, Void>() 
      { 
       @Override 
       public Void call(Map<String, String> details) 
       { 
        if (details != null && !details.isEmpty() && 
          details.containsKey("version") && details.containsKey("count")) 
        { 
         // save details 
        } else 
         throw new RuntimeException("Details not present"); 
        return null; 
       } 
      }); 



    //step 2 if step 1 is complete i.e data details are saved 
    //then bring data 

    int dataCount = 5; // the count saved from fetched details 
    List<Observable> dataCalls = new ArrayList<>(); 
    for (int i = 0; i < dataCount; i++) 
dataCalls.add(apiInterface.fetchData(token,"http://blahblahblah/data/"+i)); 

    return Observable.zip(dataCalls, new FuncN<ApiResponse>() 
    { 
     @Override 
     public ApiResponse call(Object... args) 
     { 
      // read all the data from all the observable, 
      //combine with some logic 
      // and then return just one ApiResponse. 
      return new ApiResponse(); 
     } 
    }); 
} 

は私がステップ1と2 ステップ2ステップのみ1が正常に完了している場合にのみ実行されなければならない組み合わせないか、です。

私はこれを試してみました。

public Observable<ApiResponse> getData(String id, String token) 
{ 
    return Observable.create(new Observable.OnSubscribe<ApiResponse>() 
     { 
     @Override 
     public void call(Subscriber<? super ApiResponse> subscriber) 
     { 
      apiInterface.fetchDataDetails(id) 
         .map(new Func1<Map<String, String>, Void>() 
         { 
          @Override 
          public Void call(Map<String, String> details) 
          { 
           if (details != null && !details.isEmpty() && 
             details.containsKey("version") && 
             details.containsKey("count")) 
           { 
            // save details 
           } else 
            throw new RuntimeException("Details not 
                  present"); 
           return null; 
          } 
         }).doOnCompleted(new Action0() 
          { 
           @Override 
           public void call() 
           { 
            int dataCount = 5; // the count saved 
                 //from fetched details 
            List<Observable> dataCalls = new 
                 ArrayList<>(); 
            for (int i = 0; i < dataCount; i++) 
            dataCalls.add(apiInterface 
               .fetchData(token, 
             "http://blahblahblah/data/"+i)); 

            return Observable.zip(dataCalls, new 
            FuncN<ApiResponse>() 
            { 
            @Override 
            public ApiResponse call(Object... args) 
            { 
             // read all the data from all the 
             //observable, combine with some logic 
             // and then return just one 
             //ApiResponse. 
             return new ApiResponse(); 
            } 
            }); 
           } 
          }); 
      } 
     }); 
    } 

しかし、この方法では私のデータを送り返すことができなくなり、これは反パターンのように感じます。

答えて