从包含诺言的函数中返回变量

时间:2019-04-07 22:52:16

标签: javascript node.js express

我正在创建一个使用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);

谢谢你,尼古拉

2 个答案:

答案 0 :(得分:0)

steampicturesteamname是异步的。您需要返回它们生成的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中的变量。您不能确定函数是否成功,所以您也应该处理失败