Javascript Parse Promise函数给出了'成功/错误未被调用'错误

时间:2014-06-10 17:27:17

标签: javascript promise

我希望我的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!');
        });
    });
});

1 个答案:

答案 0 :(得分:4)

Ghobs,这里发生了一些事情,让我们一一拿走:

  1. 如果未调用整体解析Error: success/error was not calledresponse.success(),则会调用错误response.error()。这是客户端接收响应所必需的。请记住,successerror会被调用一次。

  2. 你对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的返回。

  3. 例如

        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;
        })());
    
    1. 最后您对回复做了什么。可以在此处找到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();
      });
      
    2. 希望这会有所帮助,祝你好运Ghobs!