我有这两个函数,我从“Count”调用“http”,“http”返回 promise 。我想在“Count”中使用“http”的返回值。我现在收到的是未定义!!! 我缺少什么?
计数功能:
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);
.
.
.
}
最佳答案
依靠通过外部接口(interface)调用自己的函数并不是一个很好的做法。
现在您已经意识到您将需要相同的代码来实现不同的目的,您应该花时间重构您的代码,这样您就不需要调用 'http'
通过 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 .
如果 Parse.Cloud.run
在另一个虚拟机上运行您的函数,这应该没问题,但这种奇怪的行为是不通过外部调用重构和重用代码的另一个症状(使用 JSON 传递在其基础设施内进行 HTTP 请求!这可能会大大降低性能并计入您的请求/秒配额)。如果 Parse 做了一些魔法来直接调用您的函数,就好像它是在同一环境中定义的一样,那么您将会遇到问题,因为它不是一个实际的Array
。
如果可能的话,您应该修改该函数以返回正确的数组。 Parse CloudCode 的版本为 Underscore图书馆:
// on http
var _ = require('underscore');
Parse.Promise.when(promises).then(function() {
var results = _.toArray(arguments) // equivalent to Array.prototype.slice above
response.success(results);
}
关于javascript - 在另一个函数中请求函数响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752377/