我正在构建一个包含四个函数的promise链。承诺的目的是进行一些API调用。每个API调用都会影响下一个,有些需要多个参数。
以下代码的基本流程如下:
geocodeLocation
是第一个函数,它将$scope.location
输入进行地理编码,该对象包含result
,lat
和{{1}的lng
对象}} formattedAddress
是第二个需要前一个函数getSearchCount
的函数。此函数使用Restangular查询API并返回result
对象。plucked_result
函数需要saveLocation
和result
创建新位置,具体取决于plucked_result
是否小于plucked_result.search_count
。此函数返回1
变量。search_count
需要getPhotos
和result
个参数。使用它们构建一个被激活的API请求URL。当响应返回时,search_count
将保存到数据库。 错误发生在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
变量?
答案 0 :(得分:0)
解决。 Promise不能在它们之间传递多个参数,因此您需要将所有对象和变量捆绑到一个数组中,并在函数之间传递该数组。例如:
var getSearchCount, saveLocation;
getSearchCount = function(result) {
return Global.locationsRoute().getList().then(function(data) {
var passed_data, plucked_result;
plucked_result = _.findWhere(data, {
name: result.formattedAddress
});
passed_data = [result, plucked_result];
return passed_data;
});
};
saveLocation = function(passed_data) {
var newLocation, plucked_result, result, search_count;
result = passed_data[0];
plucked_result = passed_data[1];
search_count = plucked_result.search_count;
if (!(search_count < 1)) {
plucked_result.search_count = search_count + 1;
plucked_result.put();
} else {
newLocation = {
name: result.formattedAddress,
lat: result.lat,
lng: result.lng,
search_count: 1
};
Global.locationsRoute().post(newLocation);
}
passed_data = [result, search_count];
return passed_data;
};
其中passed_data
是包含对象和变量的数组。