首页 > 解决方案 > 在promise中设置一个变量并在函数nodejs之外使用它

问题描述

我有以下代码。我正在尝试在 .then 语句之外使用变量 rsname、rslevel 和 rsexp,但我似乎找不到完成这项工作的方法。(我使用的模块可以在这里找到:https ://pqt.gitbook.io/runescape-api )。

const { hiscores } = require('runescape-api');

var rsn = "le me";

var rsnlookup = hiscores.getPlayer(rsn).then(data => {
    var rsname = data.name;
    var rslevel = data.skills.dungeoneering.level;
    var rsexp = data.skills.dungeoneering.experience;

    console.log(rsname);
    console.log(rslevel);
    console.log(rsexp);

})

rsnlookup.catch((error) => {
    console.error("This username doesn\'t exist.");
  });

  console.log(rsnlookup);

标签: javascriptnode.jsjson

解决方案


你不能,用你目前的设置。这就是它的本意。无论您对这些变量做什么,都不能离开该功能。

您可以使用以下函数将数据传递到其他地方:

const { hiscores } = require('runescape-api');

var rsn = "le me";

function doSomethingWithData(rsname, rslevel, rsexp) {
    console.log(rsname, rslevel, rsexp);
}

var rsnlookup = hiscores.getPlayer(rsn).then(data => {
    var rsname = data.name;
    var rslevel = data.skills.dungeoneering.level;
    var rsexp = data.skills.dungeoneering.experience;
    
    doSomethingWithData(rsname, rslevel, rsexp);
})

rsnlookup.catch((error) => {
  console.error("This username doesn\'t exist.");
});

这就是 JavaScript 应该如何工作的。每当您调用另一台服务器时,JS 不会停止并等待请求返回。当请求仍在互联网上传输给您时,它实际上会继续执行。这就是为什么你需要提供一个回调函数,让它在完成后返回并执行。

例如,这里有一个更简单的细分:

// The variables must be declared outside the function for them
// to be accessible from outside the function.
let rsname;
let rslevel;
let resexp;

// This call only BEGINS the request. It will not stay and wait for it.
hiscores.getPlayer(rsn).then(data => {
    // This code is only executed after the request comes back with the data,
    // so the data can only be used from here.
    // These variables do not get declared until this time,
    // so they won't exist outside this function until the request is done.
    // You need to pass them out to wherever they are needed from here,
    // or do all your logic with it right here.
    rsname = data.name;
    rslevel = data.skills.dungeoneering.level;
    rsexp = data.skills.dungeoneering.experience;
});
// This is executed the moment the request begins, it does not wait for it to return.
console.log(rsname); // The variables are still undefined here since the request is not back yet here.

本质上,所有“异步”意味着代码将开始执行,并继续向前而不等待它完成。然后当它完成后,它会返回执行某种回调函数。


推荐阅读