在发送响应之前等待httpRequests完成 - ParseServer

时间:2017-01-06 07:56:36

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

我试图了解承诺如何运作,但我没有得到结果。我尝试了很多例子,没有任何作用。

此代码是一个Parse云代码函数,它接收一个数组o字符串,每个字符串都是我请求的url的一部分,因此,如果我收到一个包含3个元素的数组,则代码必须使httprequest为3 url& #39;收集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>"
        )
    );
}

2 个答案:

答案 0 :(得分:0)

通过检查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的文档。

检查Parse.Promise.when的{​​{3}}。

答案 1 :(得分:0)

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

我没有使用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");
    });

}