2015-03-30 17 views
6

मेरे पास एपीआई कॉल के अनुक्रम के साथ जावा ऐप है (मैं रेट्रोफिट का उपयोग कर रहा हूं)। वर्तमान में यह पिरामिड की तरह दिखता है:जावा में कॉलबैक नरक से कैसे बचें?

mApi.login(request, new Callback<LoginResponse>() { 
    @Override 
    public void success(LoginResponse s, Response response) { 
    mApi.getRoutes(request, new Callback<RoutesResponse>() { 
     @Override 
     public void success(RoutesResponses, Response response) { 
      ... 
     } 
     @Override 
     public void failure(RetrofitError error) {} 
    } 
    } 

    @Override 
    public void failure(RetrofitError error) {} 
}); 

क्या कॉलबैक नरक से बचने के लिए कुछ पुस्तकालय हैं? जावास्क्रिप्ट में दो चरण या क्यू की तरह।

+0

बस भीतरी वर्गों और प्रत्येक चरण के लिए उपयोग तरीकों ढेर नहीं है? या एक घटना तंत्र का उपयोग करें। – dube

उत्तर

2

जब तक आप केवल एपीआई कॉल अनुक्रमित कर रहे हैं, तो आप कॉलबैक के बजाय ऑब्जर्वेबल्स का उपयोग करके और आरएक्स स्ट्रीम समर्थन के साथ उन्हें एक साथ जोड़कर रेट्रोफिट के आरएक्सजेवा समर्थन को नियोजित कर सकते हैं। मैं ज्यादातर एक एपीआई कॉल के दूसरे रूप में परिवर्तित करने के लिए .flatmap() फ़ंक्शन का उपयोग करता हूं।

सबसे पहले मैं कॉलबैक के साथ लोगों के बजाय कॉल के प्रत्यक्ष संस्करण का उपयोग किया जाएगा, जो हो जाएगा: आपके मामले में, यह कुछ इस तरह चाहते हैं

Observable<LoginResponse> login(loginRequest); 
Observable<RoutesResponse> getRoutes(routesRequest); 

के बाद हम इन दोनों कार्यों हमारे एपीआई में, हम उन्हें RxJava धाराओं के साथ एक साथ जोड़ सकते हैं। यहाँ त्रुटि जाँच के बिना एक है, मैं एक त्वरित उदाहरण के रूप में दिखाने के लिए चलते-फिरते यह लिख रहा हूँ:

public Observable<RoutesResponse> rxGetRoutes(loginRequest, routesRequest) { 
    final YourAPI mAPI = YourApiProvider.getInstance(); 

    return mAPI.login(loginRequest) 
    //using flatmap to convert one answer to another answer 
    .flatmap((Func1) LoginResponse -> { 
     return mAPI.getRoutes(routesRequest); 
    }); 
} 

अब आप का पालन करेंगे और सामान्य रूप में इस समारोह के लिए लौट आए प्रत्यक्ष करने के लिए सदस्यता, RxJava थोड़ा सीखने के बाद कर सकते हैं:

rxGetRoutes(loginReq, routesReq) 
    .observeOn(//the thread you want to observe on) 
    .subscribe(new Subscriber<RoutesResult>() { 
      @Override 
      //the functions of Subscriber you need to override 
      //where you can also check for errors 
      //Check RxJava documentation after your IDE completes this area. 
       }); 
4

lambda expressions का उपयोग कॉलबैक hell.But इस तरह से छुटकारा मिल जाएगा, के बाद से Callback<T> इंटरफेस 2 सार तरीकों के होते हैं, तो आप सीधे lambdas उपयोग नहीं कर सकते। यह वह जगह है जहां आरएक्सजेवा अंदर आ जाता है। आरएक्सजेवा अधिक कार्यात्मक तरीके पेश करता है और आपको कार्यात्मक इंटरफेस का उपयोग करने में सक्षम बनाता है जहां आप कॉलबैक नरक को कम करने के लिए लैम्ब्डा का उपयोग कर सकते हैं। नमूदार दृश्यों का उपयोग करके अतुल्यकालिक और घटना आधारित प्रोग्राम लिखने के लिए एक पुस्तकालय ...

यहाँ RxJava के बारे में कुछ संसाधनों है:

RxJava ReactiveX (रिएक्टिव एक्सटेंशन) के एक जावा वी एम कार्यान्वयन है और लैम्ब्डा।

+0

आपके पहले दो लिंक @bhdrkn टूटा हुआ है। कृपया हल करें। धन्यवाद। – oddmeter

+0

@oddmeter लिंक अपडेट किए गए हैं! – bhdrkn

संबंधित मुद्दे