С моей точки зрения, вы правильно используете сопрограмму. Несколько замечаний:
Вам не нужно передавать view: MyView
в конструктор и присваивать его значение свойству в блоке init
. Вместо этого вы можете пометить параметр view
в конструкторе как val
, и он станет свойством: функция
class MyPresenter(private val view: MyView,
private val coroutineCtx: CoroutineContext = Dispatchers.Main) : CoroutineScope {
// you can get rid of the next lines:
private var view: MyView? = null
init {
this.view= view
}
}
launch
возвращает значение Job
. Вы можете добавить функцию расширения, например, launchSilent
, чтобы вернуть Unit
:
fun CoroutineScope.launchSilent(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
) {
launch(context, start, block)
}
Из моих наблюдений job.cancel()
работает правильно: когда вы вызываете его, сопрограмма должна остановиться. Например, если мы поместим несколько журналов:
fun updateData() = launch{
Log.d("Tag", "launch start")
val scanResult = repo.updateData()
when(scanResult) {
success -> { this.view.showSuccess()}
}
Log.d("Tag", "launch end")
}
и добавим некоторую задержку в функцию репо updateData()
:
suspend fun updateData(): Result<Void> {
delay(5000)
val response = API.update().await()
return response
}
И, например, во фрагменте после вызова presenter.updateData()
] мы называем что-то вроде Handler().postDelayed({ presenter.stopUpdate() }, 3000)
, мы не увидим «конец запуска» в журнале Logcat .
Просто небольшая справка о том, как происходит ошибка загрузки ...
$("body").load("/someotherpath/feedsx.pxhp", {limit: 25},
function (responseText, textStatus, req) {
if (textStatus == "error") {
return "oh noes!!!!";
}
});
Редактировать: Добавлен путь, отличный от корневого пути, как того требуют комментарии.
Помимо передачи обратного вызова в функцию load (), как предлагает Ólafur Waage, вы также можете зарегистрировать «глобальные» обработчики ошибок (глобальный, как глобальный для всех вызовов ajax на странице).
Существует по крайней мере два способа регистрации глобальных обработчиков ошибок Ajax:
Зарегистрируйте только обработчик ошибок с помощью ajaxError ()
:
$.ajaxError(function(event, request, settings) {
alert("Oops!!");
});
Или используйте ajaxSetup ()
для одновременной установки обработчика ошибок и других свойств:
$.ajaxSetup({
timeout: 5000,
error: function(event, request, settings){
alert("Oops!");
}
});
load () предлагает обратный вызов.
Обратный вызов.
Функция вызывается, когда запрос ajax завершен (не обязательно успех).
Вот как это сделано IIRC. (не проверял)
$("#feeds").load("feeds.php", {limit: 25},
function (responseText, textStatus, XMLHttpRequest) {
// XMLHttpRequest.responseText has the error info you want.
alert(XMLHttpRequest.responseText);
});
В электроинструменте есть статья под названием «Загрузка контента с помощью jQuery AJAX и устранение сбоев» , в которой Похоже, что он отвечает на ваш вопрос.
Очевидно, что указанная вами функция обратного вызова получает объект response, status и XmlHttpRequest, что позволяет вам определять состояние вашего запроса ajax и соответствующим образом обрабатывать условие.