【问题标题】:Wait for httpRequests to finish before sending response - ParseServer在发送响应之前等待 http 请求完成 - 解析服务器
【发布时间】:2017-01-06 07:56:36
【问题描述】:

我试图了解 Promise 是如何工作的,但我没有得到结果。我已经尝试了很多示例,但没有任何效果。

这段代码是一个 Parse cloudcode 函数,它接收一个数组 o 字符串,它们中的每一个都是我请求的 url 的一部分,所以,如果我收到一个由 3 个元素组成的数组,代码必须发出 3 个 url 的 httprequest收集 3 个响应并将其发送给客户端。这就是我所做的:

Parse.Cloud.define('getInfo', function(request,response) {

  var placas = request.params.placa;

  x(placas, function(result){
    response.success(result);
  }, function(error){
    response.error(error);
  });
});

function x(placas,callback,error){
  var url1 = 'http://XXXXX/';
  var promises = [];

  for(var i=0; i<placas.length ;i++){
    var url2 = url1.concat(placas[i]);
    promises.push(requestMulta(url2));
  }

  var data = Parse.Promise.as(promises);
  callback(data);
}

function requestMulta(url){
   var promise = new Parse.Promise(); 
   Parse.Cloud.httpRequest({
      url: url ,
      headers: {
         'Content-Type': 'application/json;charset=utf-8'
      }
   }).then(function(httpResponse) {
       ...
       promise.resolve(data);
   }, function(httpResponse) {
    //Handle error
   });
   return promise;
}

我得到的回应是:

{
    "_rejected" = 0;
    "_rejectedCallbacks" =     (
    );
    "_resolved" = 1;
    "_resolvedCallbacks" =     (
    );
    "_result" =     (
            (
            "<null>", // 3 null's because I'm testing with an array o 3 elements
            "<null>",
            "<null>"
        )
    );
}

【问题讨论】:

    标签: javascript node.js promise httprequest parse-cloud-code


    【解决方案1】:

    通过检查documentation,我输入了以下信息:

    Parse.Cloud.define('getInfo', function(request,response) {
    
      var placas = request.params.placa;
    
      x(placas).then(function(result){
        response.success(result);
      }).error(function(error){
        response.error(error);
      });
    });
    
    function x(placas,error){
      var url1 = 'http://XXXXX/';
      var promises = [];
    
      for(var i=0; i<placas.length ;i++){
        var url2 = url1.concat(placas[i]);
        promises.push(requestMulta(url2));
      }
    
     return Parse.Promise.when(promises);
    
    }
    

    您正在使用Parse.Promise.as,它正在立即解决承诺,请查看Parse.Promise.as 的文档。

    检查documentation 是否为Parse.Promise.when。

    【讨论】:

    • 我也尝试过这种方式得到相同的结果,似乎函数 requestMulta 在我得到 http 响应之前就完成了
    • 您确定使用上面的代码吗?你能在特定位置使用 console.log() 确保承诺没有解决吗?
    【解决方案2】:

    我最终改变了一些东西,我希望这对某人有用。

    我没有使用 Promise,而是安装了库 Async (http://caolan.github.io/async/),它可以帮助您制作多个异步函数,而且非常易于使用。

    新代码:

    Parse.Cloud.define('getInfo', function(request,response) {
    
      var placas = request.params.placa; //this is an array whith the variables I'll use in the functons
    
      x(placas).then(function(result){
        response.success(result);
      }).error(function(error){
        response.error(error);
      });
    });
    
    function x(placas,callback,error){
    
        async.map(placas, requestMulta, function(err, results) {
            console.log(results)
            callback(results);
        });
    }
    
    function requestMulta(placa, callback){
    
        var url = 'http://XXXXX/' + placa;
        Parse.Cloud.httpRequest({
            url: url ,
            headers: {
                'Content-Type': 'application/json;charset=utf-8'
            }
        }).then(function(httpResponse) {
    
            //... (The process you want)...
    
            callback(null,data);
    
        }, function(httpResponse) {
    
            var data = {};
            console.error('Request failed with response code ');
            error("Error");
        });
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2017-02-12
      • 2020-10-20
      相关资源
      最近更新 更多