2015-12-21 67 views
0

我目前有一个功能,它会将httpRequestjson解析为网址的array。我想在第一个请求完成并解析数据后再触发第二个httpRequest,在我尝试的两个解决方案下面都返回null。解析第一个请求中的数据后,解析第二个httpRequest

Parse.Cloud.define("FetchData1", function(request, response) { 
     var promises = _.map(urls, function(url) { 
      return Parse.Cloud.httpRequest({ url:url }); 
      }); 
     Parse.Promise.when(promises).then(function() { 
    //Creates an array of urls from request data to be used in second http request 
      createSearchUrls(arguments).then(function() { 
       //Fire second HTTP request here after urls have been created from first request data 
       promises_1 = _.map(appTitles, function(appTitles) { 
        return Parse.Cloud.httpRequest({ url: appTitles}); 
        }); 
       }) 
      }); 
     Parse.Promise.when(promises_1).then(function() { 
      //nothing returned 
      response.success(_.toArray(arguments)); 
      }, function (error) { 
       response.error("Error: " + error.code + " " + error.message); 
      }); 
     }); 



解决方法1溶液2(使用thencreateSearchUrl()功能

var promises1 = []; 
Parse.Cloud.define("FetchData", function(request, response) { 
    var promises = _.map(urls, function(url) { 
     return Parse.Cloud.httpRequest({ url:url }); 
     }); 
    Parse.Promise.when(promises).then(function() { 
     createSearchUrls(arguments) 
     //Creates an array of urls from request data to be used in second http request 
     });  
    //Fire second HTTP request here after urls have been created from first request data 
    var promises1 = _.map(appTitles, function(appTitles) { 
     return Parse.Cloud.httpRequest({ url: appTitles}); 
     }); 
    Parse.Promise.when(promises1).then(function() { 
     //nothing returned 
     response.success(_.toArray(arguments)); 
     }, function (error) { 
      response.error("Error: " + error.code + " " + error.message); 
     }); 
    }); 

createSearchUrls()

function createSearchUrls(arguments){ 
    for (a = 0; a < arguments.length; a++){ 
     var json = JSON.parse(arguments[a].text); 
     for (i = 0; i < json.feed.entry.length; i++) { 
      var urlEncoded = encodeURI(ENCODE JSON DATA); 
      var finalUrl = 'URL HERE'; 

      appTitles.push(finalUrl); 
     } 
    } 
    return appTitles; 
} 
+0

第二块代码更接近正确,但也需要一些修复。你能发布完整的源代码吗? (虽然,当OP试图简化为一个最小的情况时,它完全赞赏,但你可能已经剔除了太多)。 – danh

+0

@danh唯一缺少的是'createSearchUrls'函数和一个变量声明。问题已更新。 – kye

回答

2

它看起来像制造一系列HTTPRequests的和收集的结果的想法是什么,可以而且应该被分解出来....

function manyRequests(urls) { 
    var promises = _.map(urls, function(url) { 
     return Parse.Cloud.httpRequest({ url:url }); 
    }); 
    return Parse.Promise.when(promises).then(function() { 
     return _.toArray(arguments); 
    }); 
} 

现在,它只是调用该两次的事....

Parse.Cloud.define("FetchData1", function(request, response) { 
    manyRequests(urls).then(function(results) { 
     createSearchUrls(results); // assigns to the gobal "appTitles" 
     return manyRequests(appTitles); 
    }).then(function(result) { 
     response.success(result); 
    }, function(error) { 
     response.error(error); 
    }); 
}); 

这就是说,调用(一个全局定义的,可能的)url列表并收集结果。从这些结果中,运行一个本地函数来生成另一个URL列表(将它们分配给全局的,可能的),调用这些URL并将结果返回给客户端。

+0

由于一些奇怪的原因,manyRequest只返回第二次被调用的响应头。 (以为我的网址存在错误,但是我已经测试了一系列不同的网址,我仍然收到相同的结果) – kye

+0

您可以发布网址的日志和第二次调用的结果吗? – danh

+0

对不起@danh你可以忽略最后的评论。它可以与一个静态的urls数组一起使用,但不能与'appTitles'一起使用。 (我猜'createSearchUrls'没有在'manyRequest'再次执行之前完成。)下面是[results](http://i.imgur.com/ASfas6u.png) – kye