在另一个函数中请求函数响应

时间:2015-11-17 08:37:34

标签: javascript parse-platform cloud-code

我有两个功能,我打电话给#34; http"来自"伯爵" " http"回报承诺。我想使用" http"的返回值。在" Count"。我现在收到的是未定义 !!! 我错过了什么?

计数功能:

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

var query = new Parse.Query('MyS');
  query.equalTo("Notify", true);
  query.notEqualTo ("MainEventCode", '5');

  query.find({
    success: function(results) {
      Parse.Cloud.run('http', {params : results}).then(
        function(httpResponse) {
          console.log('httpResponse is : ' + httpResponse.length);
          response.success('Done !');
        }, function(error) {
          console.error(error);
      });
    },
    error: function(error) {
      response.error(error);
    }
  });
});

http功能:

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

var query = new Parse.Query(Parse.Installation);
.
.
.
}

2 个答案:

答案 0 :(得分:2)

依靠通过外部接口调用自己的函数不是一个很好的做法。

既然您已经意识到您将需要相同的代码用于不同的目的,您应该花时间重构您的代码,这样您就不需要通过{调用'http'处理程序{1}}:

Parse.Cloud.run()

我已经看了另一个问题,就function doHttp(params) { // original implementation here } Parse.Cloud.define('http', function(request, response) { doHttp(request.params) .then(response.success) .fail(response.error); } Parse.Cloud.define('count', function(request, response)) { var query = new Parse.Query('MyS'); query.equalTo("Notify", true); query.notEqualTo ("MainEventCode", '5'); query.find() .then(doHttp) // doHttp will receive the results from `query` as its parameter .then(function(httpResponses) { // httpResponses is an array-like object as per the other question: httpResponses = Array.prototype.slice.call(httpResponses); httpResponses.forEach(function (response) { console.log('httpResponse is : ' + response.length); }); }).fail(response.error); } 的实施情况而言,我相信你错过了count正在返回'http'的观点,其中只是Array-like object

如果arguments在另一个虚拟机上运行您的函数,这应该没问题,但这种奇怪的行为是不通过外部调用重构和重用代码的另一个症状(使用JSON在其基础结构内部的HTTP请求)传递!它可能会大大降低性能并计入您的请求/秒配额)。如果Parse反而直接调用你的函数,就好像它是在同一个环境中定义的那样,你就会遇到问题而不是真正的Parse.Cloud.run

如果可能,您应该修改该函数以返回正确的数组。解析CloudCode有Underscore库的版本:

Array

答案 1 :(得分:1)

我认为你所问的是如何使用外部可调用的云功能作为更大的云程序中的一步。以下是如何做到这一点:(@ paolobueno基本上是正确的,细节上只有几个错误。)

首先,让我们将'http'云函数转换为常规JS函数。我们需要做的就是分解requestresponse对象。 (@paolobueno有一个很好的想法,使用underscorejs,但我不会在这里,因为它是另一个新的东西要学习。)

// for each object passed in objects, make an http request
// return a promise to complete all of these requests
function makeRequestsWithObjects(objects) {
    // underscorejs map() function would make this an almost one-liner
    var promises = [];
    for (var i = 0; i < objects.length; i++) {
        var object = objects[i];
        promises.push(makeRequestWithObject(object));
    }
    return Parse.Promise.when(promises);
};

// return a promise to do just one http request
function makeRequestWithObject(object) {
    var url = 'http://185.xxxxxxx'+ object +'&languagePath=en';
    return Parse.Cloud.httpRequest({ url:url });
}

看起来您希望更新的云功能 - 而不是使用来自客户端的参数 - 首先进行查询并将该查询的结果用作http调用函数的参数。这是怎么做的。 (再次,使用@ paolobueno的优秀做法,将因子分解为承诺返回函数......)

// return a promise to find MyS instances
function findMyS() {
    var query = new Parse.Query('MyS');
    query.equalTo("Notify", true);
    query.notEqualTo ("MainEventCode", '5');
    return query.find();
}

现在我们拥有了制作一个清晰,简单的公共功能所需的一切......

Parse.Cloud.define('count', function(request, response) {
    findMyS().then(function(objects) {
         return makeRequestsWithObjects(objects);
    }).then(function(result) {
        response.success(result);
    } , function(error) {
        response.error(error);
    });
});