解析第一个请求的数据后触发第二个httpRequest

时间:2015-12-21 20:01:16

标签: javascript parse-platform cloud-code

我目前有一个函数可以生成httpRequest并将收到的json解析为array个网址。我希望在第一个请求完成并且数据被解析后触发第二个httpRequest,在我尝试的两个解决方案之前都返回null。

解决方法1

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);
        });
    });

解决方案2(在then功能后使用createSearchUrl()

    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);
            });
        });

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;
}

1 个答案:

答案 0 :(得分: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分配给全局),调用它们并将结果返回给客户端。