我当前正在尝试将2个对象发送到前端.hbs前端。但是我似乎无法解决如何做到这一点,因为我正在使用Promise。
当前,我的想法是我执行sql查询,提取国家和组织名称,然后将每个名称发送到地理编码api,返回并按相同的承诺压在一起。但是我不确定如何为渲染功能提取这些。
节点
//route for homepage
app.get('/', (req, res) => {
let sql = "SELECT org_name, country_name from places;
let query = conn.query(sql, (err, results) => {
if (err) throw err;
const geoPromise = param => new Promise((resolve, reject) => {
geo.geocode('mapbox.places', param, function(err, geoData) {
if (err) return reject(err);
if (geoData) {
resolve(geoData.features[0])
} else {
reject('No result found');
}
});
});
const promises = results.map(result =>
Promise.all([
geoPromise(result.country_name),
geoPromise(result.org_name)
]));
Promise.all(promises).then((geoLoc, geoBus) => {
res.render('layouts/layout', {
results: JSON.stringify(geoLoc),
businesses: JSON.stringify(geoBus)
});
});
});
});
前端通话
results1 = {{{results}}}
console.log(results1.length)
business1 = {{{businesses}}}
console.log(business1.length)
答案 0 :(得分:0)
var base = (function() {
var url = $(location).attr('href');
if (url.substr(-1) === '/') url = url.slice(0, -1);
var segments = url.split('/');
var baseUrl = this.segments[0] + '//' + this.segments[2] + '/';
var resource = this.segments[3];
function doStuffGlobally() {
//do stuff for all pages
}
return {
baseUrl,
segments,
resource,
doStuffGlobal,
};
}());
换成geo.geocode
Promise
const geoPromise = param => new Promise((resolve, reject) => {
geo.geocode('mapbox.places', param, function(err, geoData) {
if (err) return reject(err);
if (geoData) {
resolve(geoData.features[0])
} else {
reject('No result found');
}
});
});
的呼叫geo.geocode
const promises = results.map(result =>
Promise.all([
geoPromise(result.country_name),
geoPromise(result.org_name)
]));
As MadWard's answer mentions,必须解构Promise.all(promises).then(([geoLoc, geoBus]) => {
res.render('layouts/layout', {
results: JSON.stringify(geoLoc),
businesses: JSON.stringify(geoBus)
});
});
的回调参数,因为所有内容都将在第一个参数中。确保您查看他的帖子以获取更多详细信息
答案 1 :(得分:0)
重要的是要记住:在then()
回调中,您永远不会有多个参数。
现在您可能会问:对于Promise.all()
,这个值是多少?
好吧,它是一个数组,其中包含等待调用中的所有值(按它们被调用的顺序)。
如果您这样做:
Promise.all([
resolveVariable1, resolveVariable2, resolveVariable3
]).then((values) => {
})
values
将是[variable1, variable2, variable3]
,即诺言所解决的三个变量。
但是,您的情况要复杂一些。最后将返回一个包含每个条目的二维数组。它是一个长度为results.length
的数组,每个元素的长度为 2 。第一个元素是result
,第二个元素是business
。
这是您的摘录:
Promise.all(promises)
.then((values) => {
let results = values.map(elmt => elmt[0]);
let businesses = values.map(elmt => elmt[1]);
res.render('layouts/layout', {
results: JSON.stringify(results),
businesses: JSON.stringify(businesses)
});
})