benlau/asyncfuture

Add `contextObject` to function `subscribe`

Opened this issue · 1 comments

Considering this situation: Display a dialog, and then use AsyncFuture to send a network request, and the result will be displayed on the interface when the network request responds. I used the following logic (pseudo code):

Dialog::request()
{
    auto future = ... ; // request data from network
    observe(future).subscribe([=](QString data){  // onComplete
        ui->label->setText(data);
    },
    [=](){ // onCanceled
        ui->errorLabel->setText("error");
    });
}

But before the network reply, the user may close the dialog. In this case, the ui->label in onComplete has been destroyed, causing a crash.

Is there any plan to add contextObject to function subscribe? So I can modify code like this

Dialog::request()
{
    auto future = ... ; // request data from network
-    observe(future).subscribe([=](QString data){  // onComplete
+    observe(future).subscribe(this, [=](QString data){  // onComplete
        ui->label->setText(data);
    },
    [=](){ // onCanceled
        ui->errorLabel->setText("error");
    });
}

You can use observe(future).context(ui-label, {}, {} ) function instead of subscribe(). I've fixed a bunch of bugs on my fork.