【问题标题】:How i can get response from $resource POST request我如何从 $resource POST 请求中获得响应
【发布时间】:2013-04-02 08:48:00
【问题描述】:

看来我的要求:

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 获得响应?

【问题讨论】:

  • 查看 docs.angularjs 网站上的教程中的示例。范围项目接受承诺

标签: angularjs


【解决方案1】:

正如 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。

【讨论】:

    【解决方案2】:

    您好@falloff,请尝试使用以下代码 sn-p,我认为这对您有用。另外,让我知道它是否有效。

    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);
            });
        },
      }
    }]);
    

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2014-02-13
      • 2022-01-08
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2020-07-09
      相关资源
      最近更新 更多