2015-12-21 71 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