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();
}
});
}
});
}
});
}
しかし、この方法では私のデータを送り返すことができなくなり、これは反パターンのように感じます。