我正在创建一个使用npm中的steamapi的应用程序,我需要从一个函数中获取一个变量,该函数包含一个将html页面呈现给客户端的承诺。
这是我到目前为止的代码。
const SteamAPI = require('steamapi');
const steam = new SteamAPI('redacted');
function steampicture(steamid) {
steam.getUserSummary(steamid).then(function (data) {
return summary.avatar.large;
})
}
function steamname(steamid) {
steam.getUserSummary(steamid).then(summary => {
return summary.nickname;
})
}
var express = require('express'),
app = express();
app.use(express.static(__dirname + '/public'));
app.engine('html', require('ejs').renderFile);
app.get('/', function (req, res) {
var steamid = req.query.steamid;
console.log(steampicture(steamid))
res.render('index.html', {
name: steamname(steamid),
picture: steampicture(steamid),
});
});
app.listen(80);
谢谢你,尼古拉
答案 0 :(得分:0)
steampicture
和steamname
是异步的。您需要返回它们生成的promise,以便可以在它们执行异步调用后 呈现响应。
类似的东西:
function steampicture(steamid) {
// return the promise
return steam.getUserSummary(steamid).then(function (data) {
return data.avatar.large;
})
}
function steamname(steamid) {
return steam.getUserSummary(steamid).then(summary => {
return summary.nickname;
})
}
由于您需要等待两者都解决,因此可以调用它们并将重新调整的Promise保存到数组中,然后将其传递给Promise.all()
Promise.all
将在两个诺言都解决后解决。 然后,您可以呈现结果。像这样:
app.get('/', function (req, res) {
var steamid = req.query.steamid;
let promises = [
steamname(steamid),
steampicture(steamid)
]
Promsie.all(promises)
.then(([name, picture]) =>{
res.render('index.html', {name, picture})
});
})
您可以(也许应该)重构此函数以一次调用steam.getUserSummary()
并从同一次调用中返回化身和昵称。这样可以简化很多事情。
类似的东西:
function steampicture(steamid) {
return steam.getUserSummary(steamid).then(data => {
return [data.avatar.large, data.nickname]
})
}
将允许您拨打一个异步电话,并避免使用Promise.all
。
答案 1 :(得分:-1)
您应该返回包装在另一个Promise中的变量。您不能确定函数是否成功,所以您也应该处理失败