1

私のリクエストは次のようになります。

angular.module('todoApp').factory('UsersService', ['$resource', 'paramsService', '$q', function($resource, paramsService, $q){
var server = paramsService.serverUrl;
return {
    'auth': function(username, password){
        var $response = {};
        $resource(server + '/api/account/auth', {}, {call: {method: 'POST', headers: {'Content-Type': 'application/json'}}}).call(
            {'username': username, 'password': password},
            function(data){
                console.log(data);
                $response = data;
            }
        );
        console.log($response);
        return $response;
     },
  }
}]);

成功関数では、データに応答がありますが、変数 $response は空です。なぜそれが起こるのかはわかっていますが、応答を待って返す方法が見つかりません。$resource から応答を取得するにはどうすればよいですか?

4

2 に答える 2

0

charliefl がコメントしたように、 $resource リクエストから返された promise オブジェクトを使用して、関数の完了を待つ必要があります ($resource は非同期です)。

POST リクエストを処理するための PHP コードは、ファイルに書き込まれたバイト数を返しました。以下のコードを使用して、応答からそれを解析しました。「リソース」オブジェクトは真の配列 (「引数」など) ではなかったため、「未定義」が返されるまで可能なインデックスをループする必要がありました。

つまり、応答本文に含まれるものはすべて、リソース オブジェクトのバイト配列として返されます。

$resource(...POST REQUEST...)
        .$promise.then(function (resource) {
            var bytesSaved = '';
            var i = 0;
            while (resource[i] !== undefined) {
                bytesSaved += resource[i];
                i++;
            }
            $scope.lessonMsg = 'File saved, ' + bytesSaved + ' bytes'
        }
        function(error) {
            $scope.msg = 'An error occurred trying to save the file. ' + error;
        }
    );

POST 応答を生成する PHP コードは次のとおりです。

case "POST":
    $params = explode("file/", $_SERVER['REQUEST_URI']);
    $filename = '../common/resources/fileContents' .  $params[1] . '.json';
    $data = file_get_contents("php://input");
    $data = json_decode(file_get_contents("php://input"),false);
    $fileJson = file_put_contents($filename, json_encode($data));
    echo $fileJson;
break;

file_put_contents() 呼び出しは、書き込まれたバイト数を返すか、エラーがあった場合は false を返します。

于 2013-12-18T19:13:49.050 に答える
0

こんにちは @falloff 以下のコード スニペットを試してください。これでうまくいくと思います。また、それが機能するかどうかを教えてください。

angular.module('todoApp').factory('UsersService', ['$resource', 'paramsService', '$q', function($resource, paramsService, $q){
  var server = paramsService.serverUrl;
  return {
    'auth': function(username, password){
      let resource = $resource(server + '/api/account/auth', {}, {
        save: {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
        },
      });
      resource.save(
        {'username': username, 'password': password}, (response) => {

          if (response.length !== 0 && response.length === 0) {
            // You will get respose here in 'response'
          }
          else {
            // If response is null
          }
          deferred.resolve('request successful');
        },
        (err) => {
          // Error
          deferred.reject(err);
        });
    },
  }
}]);
于 2018-05-17T07:01:59.330 に答える