【问题标题】:Function runs after another function that comes after函数在另一个函数之后运行
【发布时间】:2018-05-10 03:04:42
【问题描述】:

我目前正在尝试使用 node.js 编写一个不和谐的机器人。目前,我有一个函数返回一个变量设置的值。之后,控制台打印出变量。但是,变量在从函数中分配值之前会在控制台上打印出来。

代码:

 if(commands[0] === "getlevel"){
  let region = commands[1] + "1";
  let username = commands[2];
  var summonerLevel;

  console.log(region, username);

  API.setRegion(region);

  summonerLevel = await API.getSummonerLevel(username);

  console.log("HI");
  console.log(summonerLevel);

  message.channel.send(summonerLevel);
  }
});

所以发生的情况是控制台在 API.getSummonerLevel(username) 函数执行之前打印了有关 summonerLevel 的信息。如何让 getSummonerLevel() 函数在 console.log() 之前运行?

函数代码:

RiotAPI.prototype.getSummonerLevel = function(_username){

var summonerJSON; var summoner;
var url = baseURL1 + region + baseURL2 + "/lol/summoner/v3/summoners/by-name/" + _username + "?api_key=" + API_KEY;

console.log("Before");

var options = {
    uri: url,
    simple: false
};

request.get(options)
    .then(function(body){
        console.log("After");
        summonerJSON = body;
        summoner = JSON.parse(summonerJSON);
        console.log(summoner);
        console.log(summoner.summonerLevel);
        return summoner.summonerLevel;
    })
    .catch(function(err){
        //should.throw.error.to.console();
    })
    .catch(function(err){
        console.log(err);
});
}

另外,我遇​​到的另一个问题是我收到未处理的承诺拒绝警告,并且 request.get(...) 之后的 .catch() 似乎无法解决它。我将如何解决这个问题?

控制台日志(不确定这是否有用但是...):

之前 你好 不明确的 (节点:13624)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:2):DiscordAPIError:无法发送空消息 (节点:13624)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。 后 { 编号:45932456, 帐号:206692908, 名称:'fire263', profileIconId: 911, 修订日期:1511729881000, 召唤师等级:36 } 36

【问题讨论】:

  • 您希望使用promise
  • 阅读错误日志的内容。
  • getSummonerLevel 不返回任何内容
  • @JaromandaX 不是吗?所以返回必须在 request/then/catch 函数之外,对吧?
  • 并不是说您需要在这些回调函数中移动任何现有的返回值,我是说您需要在getSummonerLevel拥有一个返回值......我会说, return request.get(options).... 会有所帮助

标签: javascript node.js function promise unhandled-exception


【解决方案1】:

您的代码有一些问题。

函数代码:

RiotAPI.prototype.getSummonerLevel = function(_username){

  var summonerJSON; var summoner;
  var url = baseURL1 + region + baseURL2 + "/lol/summoner/v3/summoners/by-name/" + _username + "?api_key=" + API_KEY;

  console.log("Before");

  var options = {
    uri: url,
    simple: false
  };

  return request.get(options) // you need to return the promise
    .then(function(body){
      console.log("After");
      summonerJSON = body;
      summoner = JSON.parse(summonerJSON);
      console.log(summoner);
      console.log(summoner.summonerLevel);
      return summoner.summonerLevel;
    })
    .catch(function(err){ // you should only use `.catch` once
      console.log(err);
    });
}

正如 jaromanda x 所述,您需要返回 request.get 调用,这本身就是一个承诺。

但你也不应该使用多个.catch 调用,因为如果你这样做并且你没有正确处理它(阅读:继续拒绝链)它不会转到你的第二个.catch 调用.

您可以在这里阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

更具体地说,这部分:“如果 onRejected 抛出错误或返回本身被拒绝的 Promise,则 catch() 返回的 Promise 被拒绝;否则,它被解决。

希望这将为您提供足够的信息来解决您的问题。

【讨论】:

    【解决方案2】:

    您的getSummonerLevel 没有返回承诺,这是等待的必要条件。实现这一目标的最简单方法是也将其设为 async

    RiotAPI.prototype.getSummonerLevel = async function(_username) {
        var url = baseURL1 + region + baseURL2 + "/lol/summoner/v3/summoners/by-name/" + _username + "?api_key=" + API_KEY;
    
        console.log("Before");
    
        var options = {
            uri: url,
            simple: false
        };
    
        try {
            var body = await request.get(options);
            console.log("After");
            var summonerJSON = body;
            var summoner = JSON.parse(summonerJSON);
            console.log(summoner);
            console.log(summoner.summonerLevel);
            return summoner.summonerLevel;
        } catch (err) {
            //should.throw.error.to.console();
            console.log(err);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多