我正在进行以下http get调用以获取html页面源代码,然后解析它。
出于某种原因,它会一直返回undefined。
我该如何解决?
更新:似乎
$http.get()
是异步的,那么我该如何从中返回一个值呢?
function checkInventory() {
var newReqObj = DataService.getFormData();
var store = newReqObj.store;
var code = newReqObj.code;
var size = newReqObj.size;
if(store === 'nike') {
var inventoryData = checkNike(store, code, size);
$log.debug(inventoryData);
return inventoryData;
}
}
function checkNike(store, code, size) {
var inventoryData = {
'qtyAvailable': 0,
'maxOrder': 0,
'size': 0,
'name': '',
'price': '',
'url': '',
'code': code
};
var url = 'http://www.nike.co.uk/search?q=' + code;
checkNikeUrl(url, size, inventoryData);
}
function checkNikeUrl(url, size, inventoryData) {
$http.get(url).then(function(response) {
var html = response.data;
inventoryData.qtyAvailable = utility.getProductQty(html, size);
inventoryData.maxOrder = utility.getProductMaxOrder(html, size);
inventoryData.size = size;
inventoryData.name = utility.getProductName(html);
inventoryData.price = utility.getProductPrice(html);
inventoryData.url = url;
return inventoryData;
})
};
答案 0 :(得分:1)
你必须在你的代码中添加2个返回。
第一:
$http.get(url).then(function(response) {
应该是
return $http.get(url).then(function(response) {
第二次
checkNikeUrl(url, size, inventoryData);
应该是
return checkNikeUrl(url, size, inventoryData);
修改
我认为
var inventoryData = checkNike(store, code, size);
应该只是
return checkNike(store, code, size);
答案 1 :(得分:1)
您可以按如下方式重写代码:
function checkInventory() {
var newReqObj = DataService.getFormData();
var store = newReqObj.store;
var code = newReqObj.code;
var size = newReqObj.size;
if(store === 'nike') {
var deferred = $q.defer();
checkNike(store, code, size).then(function(response){
var inventoryData = response;
$log.debug(inventoryData);
deferred.resolve(inventoryData);
});
return deferred.promise;
}
}
function checkNike(store, code, size) {
var inventoryData = {
'qtyAvailable': 0,
'maxOrder': 0,
'size': 0,
'name': '',
'price': '',
'url': '',
'code': code
};
var url = 'http://www.nike.co.uk/search?q=' + code;
return checkNikeUrl(url, size, inventoryData);
}
function checkNikeUrl(url, size, inventoryData) {
var deferred = $q.defer();
$http.get(url).then(function(response) {
var html = response.data;
inventoryData.qtyAvailable = utility.getProductQty(html, size);
inventoryData.maxOrder = utility.getProductMaxOrder(html, size);
inventoryData.size = size;
inventoryData.name = utility.getProductName(html);
inventoryData.price = utility.getProductPrice(html);
inventoryData.url = url;
deferred.resolve(inventoryData);
})
return deferred.promise;
};
您可以使用此方法以及调用checkInventory()方法的方法,它们可以捕获承诺并处理返回的库存值。