2016-07-21 2 views
2

Я пытаюсь установить переменную в моем контроллере на возвращаемое значение функции. Эта функция создает новую запись в таблице и возвращает ее идентификатор. Когда я отлаживаю инструменты для Chrome, я вижу, что моя функция работает правильно и что response.data фактически является номером. Однако, когда я пытаюсь установить переменную для этого вызова функции, значение устанавливается как неопределенное.Установить переменную javascript для возврата значения функции

Мой AngularJS компонент:

function saveNewGame($http, gameData) { 

    var newGameData = { 
     "InvestigatorGroupUserId": gameData.GroupUserId, 
     "InvestigatorGroupGameId": gameData.GroupGameId, 
     "WithTeacher": gameData.WithTeacher 
    }; 

    $http.post("/APGame.WebHost/play/newGamePlayed", newGameData) 
     .then(function(response) { 
      return response.data; 
     }); 

} 

function controller($http) { 

    var model = this; 
    var gameData = model.value; 
    var gamePlayedId; 

    model.startGame = function() { 
     gamePlayedId = saveNewGame($http, gameData); 
     alert(gamePlayedId); 
    }; 
} 

module.component("gameApp", 
{ 
    templateUrl: "/APGame/GameAngular/game-app.html", 
    controllerAs: "game", 
    bindings: { 
     value: "<" 
    }, 
    controller: ["$http", controller] 
}); 

Это то, что делает мой вызов службы:

[OperationContract] 
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "newGamePlayed")] 
    int NewGamePlayed(GamePlayedData gamePlayedData); 



    public int NewGamePlayed(GamePlayedData gamePlayedData) 
    { 
     var gamePlayedRepo = _gamePlayedRepo ?? new GamePlayedRepository(); 

     var newGame = new GamePlayed() 
     { 
      InvestigatorGroupUserId = gamePlayedData.InvestigatorGroupUserId, 
      InvestigatorGroupGameId = gamePlayedData.InvestigatorGroupGameId, 
      GameStartTime = DateTime.Now, 
      IsComplete = false 
     }; 

     return gamePlayedRepo.Create(newGame); 
    } 

ответ

1

Причина в том, что ваша функция не возвращает никакого значения, таким образом, не определено.

$http.post("/APGame.WebHost/play/newGamePlayed", newGameData) 
    .then(function(response) { 
     // notice that you are returning this value to the function(response) not your saveNewGame function 
     return response.data; 
    }); 

Из-за асинхронного характера javascript вы должны сделать что-то вроде этого. $ http.post возвращает объект обещания, который можно использовать следующим образом.

return $http.post("/APGame.WebHost/play/newGamePlayed", newGameData); 

И в вашей функции вызова.

saveNewGame($http, gameData).then(function(response){ 
    gamePlayedId = response.data; 
}); 
+0

Когда я делаю предупреждение на' gamePlayedId' внутри функции then, оно возвращает правильное значение. Но когда я делаю это за пределами, он показывает 'undefined' –

+0

, потому что http.post является асинхронным, функция (ответ) вызывается, когда HTTP-запрос завершен. , когда вы выходите за пределы функции, запрос все еще не завершен, и значение еще не назначено. –

2

Добавить обещание resolvement слушателю метода вызова, как следующее:

model.startGame = function() { 
    gamePlayedId = saveNewGame($http, gameData)then(function(response) { 
     alert(response.data); 
    }, function(reason) { 
     alert('Failed: ' + reason); 
    }); 
}; 

Возвращение http.get обещание вместо данных

function saveNewGame($http, gameData) { 

    var newGameData = { 
     "InvestigatorGroupUserId": gameData.GroupUserId, 
     "InvestigatorGroupGameId": gameData.GroupGameId, 
     "WithTeacher": gameData.WithTeacher 
    }; 

    return $http.post("/APGame.WebHost/play/newGamePlayed", newGameData); 
} 
+0

Я пытался что-то похожее на это раньше (и как раз пытался это сейчас), и я получаю сообщение об ошибке: 'Не удается прочитать свойство« то»из undefined' –

+0

Это было возможно потому, что вы не вернуть $ HTTP обещаю. Вы можете попробовать? –

+0

Я только что попробовал отредактированный ответ, но изменил ваше предупреждение на 'alert (response.data)', и это сработало, спасибо !. Почему мне нужно вернуть данные из вызова функции в 'saveNewGame' вместо самой функции? –