我希望我的Parse云代码遍历对象的实例,并console.log
每次itemCondition
属性。根据我的研究,因为这是一个asynch http请求,看起来最好的方法是使用promise语句。然而,当我在下面运行我的尝试时,我收到一条错误,指出Error: success/error was not called
。我的印象是你在编写一个promise函数时没有使用显式的成功/错误语句,我不明白这是对的吗?
Parse.Cloud.define("MatchCenterTest", function(request, response) {
//defines which parse class to iterate through
var matchCenterItem = Parse.Object.extend("matchCenterItem");
var query = new Parse.Query(matchCenterItem);
var promises = [];
//setting the limit of items at 10 for now
query.limit(10);
query.find().then(function(results) {
//the pinging ebay part
for (i=0; i<results.length; i++) {
url = 'http://svcs.ebay.com/services/search/FindingService/v1';
promises.push(Parse.Cloud.httpRequest({
url: url,
params: {
'OPERATION-NAME' : 'findItemsByKeywords',
'SERVICE-VERSION' : '1.12.0',
'SECURITY-APPNAME' : '*APP ID GOES HERE*',
'GLOBAL-ID' : 'EBAY-US',
'RESPONSE-DATA-FORMAT' : 'JSON',
'REST-PAYLOAD&sortOrder' : 'BestMatch',
'paginationInput.entriesPerPage' : '3',
'outputSelector=AspectHistogram&itemFilter(0).name=Condition&itemFilter(0).value(0)' : results[i].get('itemCondition'),
'itemFilter(1).name=MaxPrice&itemFilter(1).value' : results[i].get('maxPrice'),
'itemFilter(1).paramName=Currency&itemFilter(1).paramValue' : 'USD',
'itemFilter(2).name=MinPrice&itemFilter(2).value' : results[i].get('minPrice'),
'itemFilter(2).paramName=Currency&itemFilter(2).paramValue' : 'USD',
//'itemFilter(3).name=LocatedIn&itemFilter(3).Value' : request.params.itemLocation,
'itemFilter(3).name=ListingType&itemFilter(3).value' : 'FixedPrice',
'keywords' : results[i].get('searchTerm'),
}
}));
console.log(results[i].get('itemCondition'));
}
Parse.Promise.when(promises).then(function(results) {
for (i=0; i<results.length; i++)
{
var httpresponse = JSON.parse(httpResponse.text);
response.success(httpresponse);
console.log(results[i].get('itemCondition'));
}
}, function(err) {
console.log('error!');
});
});
});
答案 0 :(得分:4)
Ghobs,这里发生了一些事情,让我们一一拿走:
如果未调用整体解析Error: success/error was not called
或response.success()
,则会调用错误response.error()
。这是客户端接收响应所必需的。请记住,success
或error
会被调用一次。
你对when()
函数的函数数组有正确的想法,但我认为你想要发生的是,执行所有的httpRequest方法,然后从那些方法中获取响应在then
内处理它们。你在这里遇到的问题是,你正在执行httpRequest
并将响应放在数组上,而实际上你希望数组是 Promises 的数组。根据文档(https://www.parse.com/docs/js/symbols/Parse.Promise.html#.when),when
函数将promises作为参数或数组,并执行它们。因此,您需要创建一个实际Parse.Promise
对象的数组,在撰写本文时,Parse.Cloud.httpRequest
将返回Promise
个对象。所以你很幸运!所以你需要做的就是在一个函数中包含对httpRequest
的调用,这会产生Promise
httpRequest的返回。
例如
promises.push((function() {
var httpRequestPromise = Parse.Cloud.httpRequest({
url: url,
params: {
'OPERATION-NAME' : 'findItemsByKeywords',
'SERVICE-VERSION' : '1.12.0',
'SECURITY-APPNAME' : '*APP ID GOES HERE*',
'GLOBAL-ID' : 'EBAY-US',
'RESPONSE-DATA-FORMAT' : 'JSON',
'REST-PAYLOAD&sortOrder' : 'BestMatch',
'paginationInput.entriesPerPage' : '3',
'outputSelector=AspectHistogram&itemFilter(0).name=Condition&itemFilter(0).value(0)' : results[i].get('itemCondition'),
'itemFilter(1).name=MaxPrice&itemFilter(1).value' : results[i].get('maxPrice'),
'itemFilter(1).paramName=Currency&itemFilter(1).paramValue' : 'USD',
'itemFilter(2).name=MinPrice&itemFilter(2).value' : results[i].get('minPrice'),
'itemFilter(2).paramName=Currency&itemFilter(2).paramValue' : 'USD',
//'itemFilter(3).name=LocatedIn&itemFilter(3).Value' : request.params.itemLocation,
'itemFilter(3).name=ListingType&itemFilter(3).value' : 'FixedPrice',
'keywords' : results[i].get('searchTerm'),
}
})
return httpRequestPromise;
})());
最后您对回复做了什么。可以在此处找到then()
的API文档(http://www.parse.com/docs/js/symbols/Parse.Promise.html#then),表示then
将为您提供一个将所有Promise响应都设为arguments
的函数。但是因为你处于循环中并且你不知道将有多少个参数(每个调用一个),你可以使用通用的arguments
保留的var。例如,假设您想收集请求中的回复:
Parse.Promise.when(promises).then(function() {
var allResponses = []
for (i=0; i<arguments.length; i++)
{
var httpResponse = arguments[i];
var responseObj = JSON.parse(httpResponse.text);
allResponses.push(responseObj);
}
// and by the way if this is the end of your function, then here you can call
response.success(allResponses);
}, function(err) {
console.log('error!');
response.error();
});
希望这会有所帮助,祝你好运Ghobs!