2014-10-22 2 views
0

Я написал сценарий ниже. Он используется для связи с бэкэнд-сервисом. Проблема возникает, когда я называю метод «сердцебиение». Вероятно, проблема связана с тем, что 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, и есть ли способ решить это?

ответ

0

Функция heartbeat не имеет оператора возврата. (Одна из вещей, которые она делает, это создать функцию, используя выражение функции, и это выражение функции имеет оператор return, который может быть источником путаницы).

+0

Так как «heartbeat» уже возвращен «Backend» - невозможно выполнить второй оператор возврата внутри функции «heartbeat»? – Christoffer

+0

@Christoffer - Нет. Вы можете добавить оператор возврата к функции heartbeat, просто нет. (Обратите внимание, что 'req.done' является асинхронным, поэтому вы не можете вернуть' status', потому что он не будет иметь значения во времени). – Quentin

Смежные вопросы