logo
Tags down

shadow

Should a library function be suspend or return deferred


By : Martin Castillo
Date : August 01 2020, 08:00 AM
like below fixes the issue Kotlin coroutines are designed along the "sequential by default" guideline. That means that your API should always expose suspend funs and the user, if and when they really need it, can easily wrap them in async.
The advantage of that is analogous to the advantages of cold flows with respect to hot flows: a suspendable function is active only while control is inside it. When it returns, it has not left behind a task running in the background.
code :


Share : facebook icon twitter icon

jQuery deferred : use to delay return of function until async call within function complete + get return value


By : Rewatkar Yeole Kalpa
Date : March 29 2020, 07:55 AM
wish helps you The only way to delay the return of your getFields function would be to set the AJAX async property to false:
code :
   var ajaxPromise = $.ajax(
    {
      url: page,
      async: false  // make the call synchronous
    }
  );
function getFields(page)
{
  var ajaxPromise = $.ajax( //the async call
    {
      url: page
    }
  );

  var dff = $.Deferred();
  ajaxPromise.then(function(data){

    // Possibly access the loaded data in this function.
    var result = {
      'field1' : field1,
      'field2' : field2
    };

    // Notify listeners that the AJAX call completed successfully.
    dff.resolve(result);

  }, function(){
    // Something went wrong - notify listeners:
    dff.reject(/* possibly pass information about the error */);
  });

  return dff.promise();
}
var fieldPromise = getFields('http://something');
fieldPromise.done(function(result){
  console.log(JSON.stringify(result)); 
});

Suspend function 'callGetApi' should be called only from a coroutine or another suspend function


By : DrDamo
Date : March 29 2020, 07:55 AM
hop of those help? Suspend function should be called only from coroutine. That means you need to use a coroutine builder, e.g. launch. For example:
code :
class Activity : AppCompatActivity(), CoroutineScope {
    private var job: Job = Job()

    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        launch {
            val result =  callGetApi()
            onResult(result) // onResult is called on the main thread
        }
    }

    suspend fun callGetApi(): String {...}

    fun onResult(result: String) {...}
}
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'

Return a Deferred type from Polidea bluetooth library - Kotlin Coroutines


By : alhasan
Date : March 29 2020, 07:55 AM
wish help you to fix your issue I'm doing some experiments with kotlin coroutines, in particular I would like to return to my coroutine a RxBleDevice from polidea library. However, Polidea scanBleDevices function returns a Disposable on subscribe. Is there any way, according to my code, to return to my Coroutine a RxBleDevice? , You need to wrap the subscribe method call into the
code :
suspendCancellableCoroutine< RxBleDevice>{ cont ->
  //your code here
}

Conceptual question regarding suspend and Deferred


By : user3178523
Date : March 29 2020, 07:55 AM
wish helps you Retrofit 2.6.0 or newer has built-in suspend support.
Probably you are using Kotlin Coroutine Adapter. This library depends on reflection to detect whether the return type is Deffered or not. See here.
code :
interface RemoteInterface{

  @GET("/data/mydata")
  suspend fun getData(): MyModel
}
fun retrieveDataFromRemote() {
  viewModelScope.launch {
      val model = remoteInterface.getData()
      // do something with model
  }
}

Let suspend function not return anything


By : user3626639
Date : March 29 2020, 07:55 AM
this will help Option 1:
To guarantee that your state is changed, you can subscribe to changes on loading state:
code :
@Test
 fun `should set loading to true while loading`() = runBlockingTest {
     given(interactor.login()).willReturn(true)

     var invocationCounter = 0
     tested.loading.observerForever { loading -> 
         assertEquals(invocationCounter == 0, loading)
         invocationCounter++
     }

     tested.loginClicked()

     Assert.assertTrue(tested.loading.value!!)
 }

   ```
     given(interactor.login()).willAnswer {
         assertTrue(tested.loading.value)
         true
    }

    tested.loginClicked()

    Assert.assertFalse(tested.loading.value!!)
shadow
Privacy Policy - Terms - Contact Us © voile276.org