我正在构建一个包含四个功能的承诺链。承诺的目的是进行一些 API 调用。每个 API 调用都会影响以下一个,有些调用需要多个参数。
下面代码的基本流程是这样的:
geocodeLocation
是第一个函数,并将$scope.location
输入地理编码到result
包含lat
、lng
和的对象中formattedAddress
getSearchCount
是第二个需要result
前一个函数的函数。该函数使用 Restangular 查询 API 并返回一个plucked_result
对象。saveLocation
函数需要result
和plucked_result
来创建一个新的位置,基于是否plucked_result.search_count
小于1
。该search_count
变量由该函数返回。getPhotos
需要result
andsearch_count
参数。使用这些,它构建了一个被触发的 API 请求 URL。当响应返回时,将photos
保存到数据库中。
错误发生在saveLocation
函数内。返回的错误是:
TypeError: Cannot read property 'search_count' of undefined
这是代码(对发生的事情有一些评论):
var geocodeLocation, getPhotos, getSearchCount, saveLocation;
// geocode the $scope.location into a formatted address with latitude and longitude
geocodeLocation = function(location) {
return Geocoder.geocodeAddress(location).then(function(result) {
$scope.geocodingResult = "(lat, lng) " + result.lat + ", " + result.lng + " (address: '" + result.formattedAddress + "')";
console.log(result);
// pass the result object from the previous function into the next function
return result;
});
};
getSearchCount = function(result) {
// fetch the locations from the API (using Restangular)
return Global.locationsRoute().getList().then(function(data) {
var plucked_result;
// use underscore's _findWhere to pluck out the location we're looking for, and extract it's search_count
plucked_result = _.findWhere(data, {
name: result.formattedAddress
});
// this is logging correctly
console.log(plucked_result);
return plucked_result;
});
};
saveLocation = function(plucked_result, result) {
var newLocation, search_count;
// this is logging incorrectly, and is where the error occurs
search_count = plucked_result.search_count;
console.log(search_count);
// if the search_count is more than 1, increment and update the search_count
if (!(search_count < 1)) {
plucked_result.search_count = search_count + 1;
} else {
// if the search_count is less than 1, create a new location
newLocation = {
name: result.formattedAddress,
lat: result.lat,
lng: result.lng,
search_count: 1
};
Global.locationsRoute().post(newLocation);
}
return search_count;
};
// this function requires both the result and search count to build the 500px API request string
getPhotos = function(result, search_count) {
var newUrl, url;
url = Global.externalAPI() + "search?geo=" + result.lat + "," + result.lng + ",25km&rpp=5&image_size=4&tags=true&sort=votes_count&only=[Landscapes][City+%26+Architecture][Nature][Urban+Exploration][Underwater][Travel][Journalism][Black+and+White]&page=" + search_count + "&consumer_key=" + Global.consumerKey();
newUrl = Restangular.oneUrl('500px', url).get();
return newUrl.then(function(data) {
var newPhoto, photo, _i, _len, _ref, _results;
$scope.photos = data;
_ref = data.photos;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
photo = _ref[_i];
newPhoto = {
name: photo.name,
description: photo.description,
image_url: photo.image_url,
search_term: result.formattedAddress
};
_results.push(Global.photosRoute().post(newPhoto));
}
return _results;
});
};
$scope.geocode = function() {
var location;
if ($scope.location) {
location = $scope.location;
return geocodeLocation(location).then(getSearchCount).then(saveLocation).then(getPhotos);
}
};
这里的问题是:如何在所有函数之间传递result
,plucked_result
和变量?search_count