RxJava链中的操作无法正常工作

时间:2018-11-22 10:28:27

标签: android firebase google-cloud-firestore rx-java chain

我是RxJava和RxFirebase的新手,并且正在为我的应用制作注册系统。注册过程中的所有步骤都需要按顺序进行,如果步骤失败,则需要中止该顺序。

这是我的注册UI类中的代码。我在另一个类上调用register()并订阅返回值,即Maybe。

function Scrap() {
  this.loadPage = async function(url, loadTime) {

    ph_instance = await phantom.create();
    ph_page = await ph_instance.createPage();

    var status = await ph_page.open(url); // Load the Pages

    if (status == 'success') {

      async function waitMore() {
        let p = new Promise(function(res, rej) {
          setTimeout(async function() {

            var pages, jobs;
            jobs = await someFunction1();

            pages = await someFunction2();

            if (jobs === '' || pages === '' || jobs === 'undefined' || pages === 'undefined' || jobs === null || pages === null) {
              waitMore();
            } else {
              res({
                success: true,
                data: {
                  "jobs": jobs,
                  "pages": pages
                }
              });
            }
          }, loadTime);
        });

        var res = await p;
        return res;
      }
      return waitMore();
    };

  }
}

new Scrap().loadPage("example.com", 5000).then(function(res) {
  console.log("Response ", res);
})

在注册功能中,我有我的“链”:

        MyClass.register(username, email, password, photo_uri)
            .subscribe(
                a -> log(a.getUser().getDisplayName()),
                error -> { }                    
            )

问题出在SetFirestoreUsername中:

    public Maybe<AuthResult> register(String username, String email, String pass, Uri photo_uri) {
        return RxFirebaseAuth.createUserWithEmailAndPassword(mAuth, email, pass)
            .doAfterSuccess(authResult -> setFirebaseUsername(authResult.getUser(), username))
            .doAfterSuccess(authResult -> setFirestoreUsername(authResult.getUser(), username));
    }

如果您查看“有效/无效”注释,那么有效的代码段与无效的代码之间的区别在于,后者已返回并在订阅链中使用。我已经验证了setFirestoreUsername被调用。唯一的区别是,当我使用return时,RxFirestore.setDocument的内部工作原理根本不起作用,但不会引发任何错误。

1 个答案:

答案 0 :(得分:0)

在您使用doAfterSuccess()的情况下,将使用流经管道的值调用setFirestoreUsername(authResult.getUser(), username)运算符。这只是一个方法调用,结果不用作观察者链的一部分。

由于它不是观察者链的一部分,因此没有订阅。您可能需要使用flatMapCompletable()运算符而不是doAfterSuccess()