РЕДАКТИРОВАТЬ: Используйте and_
из sqlalchemy
, чтобы объединить join
условия
from sqlalchemy import and_
skills = db.session.query(Skill, User_Skill.skill_id).\
outerjoin(User_Skill, and_(User_Skill.skill_id==Skill.id,
User_Skill.user_id==4)).\
order_by(Skill.name).all()
<час> Старый, неправильный ответ (разные результаты):
[ 118] Используйте.filter
, чтобы ограничить ваши результаты. Измените ваш запрос на:
skills = db.session.query(Skill, User_Skill.skill_id).\
outerjoin(User_Skill, User_Skill.skill_id==Skill.id).\
filter(User_Skill.user_id==4).\
order_by(Skill.name).all()
Вы не можете вернуть значение из функции, значение еще не существует, когда функция возвращается.
Метод geocode
выполняет асинхронный вызов и использует обратный вызов для обработки результата, поэтому вы должны сделать то же самое в функции codeLatLng
:
var geocoder;
function initialize() {
geocoder = new google.maps.Geocoder();
var latlng = new google.maps.LatLng(40.730885,-73.997383);
codeLatLng(function(addr){
alert(addr);
});
}
function codeLatLng(callback) {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
callback(results[1].formatted_address);
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
Вы можете получить ценность, используя localalstorage.
geocoder.geocode({
'address': address,
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var latitude = results[0].geometry.location.lat();
var longitude = results[0].geometry.location.lng();
}
localStorage.setItem("endlat", latitude);
localStorage.setItem("endlng", longitude);
});
var end_lat = localStorage.getItem("endlat");
var end_lng = localStorage.getItem("endlng");
Но он возвращает предыдущее значение. Возвращает текущее значение, когда мы щелкаем дважды ...
Это возвращение не возвращается из codeLatLng
; он возвращается из анонимной функции, передаваемой в geocoder.geocode
.
Я думаю, вам нужно будет передать данные, используя другой механизм, например, глобальная переменная
Вы делаете асинхронный запрос, ваша функция codeLatLng()
завершила работу и вернулась задолго до того, как геокодер закончил работу.
Если вам нужно, чтобы данные геокодера продолжали поступать, вам придется соединить ваши функции в цепочку:
function initialize() {
geocoder = new google.maps.Geocoder();
codeLatLng();
}
function codeLatLng() {
var latlng = new google.maps.LatLng(40.730885,-73.997383);
if (geocoder) {
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
initContinued(results[1].formatted_address);
} else {
alert("No results found");
}
} else {
alert("Geocoder failed due to: " + status);
}
});
}
}
function initContinued(addr) {
alert(addr);
}
передать геокодер в качестве параметра в функцию codeLatLng ().
function codeLatLng(geocoder) {
назовите это так в своей функции инициализации:
var addr = codeLatLng(geocoder);