Я написал сценарий ниже. Он используется для связи с бэкэнд-сервисом. Проблема возникает, когда я называю метод «сердцебиение». Вероятно, проблема связана с тем, что JavaScript является асинхронным.Проблема с возвратом при отправке запроса ajax
Я использовал обещание «сделано», поэтому запрос должен быть выполнен до того, как я вернусь true или false. На данный момент «сердцебиение» просто не определено при оценке.
/**
* This module is used to communicate with the backend.
*/
var Backend = (function() {
/**
* Default settings for the Backend module.
* @type {[Object]}
*/
var settings = {
api: 'https://www.domain.tld/api'
};
/**
* This is used to create a request against the backend.
* @param {[String]} method The HTTP method to be used.
* @param {[String]} endpoint Endpoint to target.
* @return {[Object]} Returns the XHR request.
*/
var request = function(method, endpoint) {
req = $.ajax({
url: settings.api + endpoint,
type: method
});
return req;
};
return {
/**
* Check the backend status.
* @return {[Bool]} Returns true or false - depending on the status.
*/
heartbeat: function() {
var req = request('get', '/heartbeat');
req.done(function(data) {
if(data.status == 'alive') {
return true;
} else {
return false;
}
});
}
}
})();
Я делаю следующее для вызова метода:
var backend = Backend();
var heartbeat = backend.heartbeat();
heartbeat
'undefined'
Что является причиной для «биения» переменная быть неопределенным? Это из-за асинхронного использования JavaScript, и есть ли способ решить это?
Так как «heartbeat» уже возвращен «Backend» - невозможно выполнить второй оператор возврата внутри функции «heartbeat»? – Christoffer
@Christoffer - Нет. Вы можете добавить оператор возврата к функции heartbeat, просто нет. (Обратите внимание, что 'req.done' является асинхронным, поэтому вы не можете вернуть' status', потому что он не будет иметь значения во времени). – Quentin