如何将回调函数的结果传递给变量并自由访问该变量

3

我知道有很多类似于我的问题,但是我没有看到任何有用的案例来帮助我。

我有一个来自本地函数桥的回调,下面是我在JS中使用它的方式:

getAllParameter((data)=>{
  console.log(data) // data is Javascript Object
})

我尝试过使用以下代码获取data的值:

getAllParameter((data)=>{
  return new Promise((resolve)=> resolve(showToken(data.Token)))
})

async function showToken(token){
  var res = await token
  return res
}

var isiToken = showToken()
console.log("isiToken")
console.log(isiToken)

但是结果是:
isiToken
{ _40: 0, _65: 0, _55: null, _72: null }

我不知道我的代码有什么问题,我想在getAllParameter外部获取data的值,我该如何正确地做到这一点?

我需要自由地获取getAllParameter的结果并使用它的原因是,我在data中有一个token值,并且我需要在axios实例配置中使用它。

因此,我的文件的完整代码应该是:

getAllParameter((data)=>{
  return new Promise((resolve)=> resolve(showToken(data.Token)))
})

async function showToken(token){
  var res = await token
  console.log("res")
  console.log(res)
  return res
}

var isiToken = showToken()
console.log("isiToken")
console.log(isiToken)

const http = Axios.create ({
  baseURL: Constants.APILink,
  timeout: Constants.Timeout,
  headers: {'Content-Type': 'application/json', 'Authorization': 'bearer '+isiToken}

export default http
});
1个回答

2
我不确定你的getAllParameter的定义,但该方法应在最后调用回调函数。希望它能这样做,下面是一个代码片段,可以实现你想要的功能: "最初的回答"
(function() {
   var data;
   function getAllParam(callback) {
      console.log("getAllParam");
      callback("getAllParam");
   }
   getAllParam((data)=> {
      this.data = data);
      console.log(this.data);
   });
})();

最初的回答:

所以,我正在做的是:

  1. 创建一个名为data的变量;
  2. 将回调响应分配给我的data变量。(阅读箭头函数中的闭包和this)
  3. 稍后使用它。

但是这是我的代码的局限性:当getAllParam是异步函数时,它无法工作。这意味着如果回调不按顺序调用,你必须使用promise。

编辑

app.js

function getAllParam(callback) {
    console.log("getAllParam");
    callback({Token: "getAllParam"});
}

var httpPromise = new Promise(resolve => {
    getAllParam((data) => {
        let token = data.Token;
        console.log("Creating http from here using token");
        let http = Axios.create({ bearer: token});

        resolve(http);
    })
});

export default httpPromise;

file_that_imports_app_js.js

import httpPromise from "./app.js";
async function init() {
    let http = await httpPromise;

    http.get("/", ...)
}

init();

console.log(this.data) 是否打印了 getAllParam?而且我的 getAllParam 是异步的,所以我需要等待它完成工作。 - flix
getAllParam的回调函数应该在其内部使用console.log,而不是在其作用域之外。如果您的getAllParam是异步的,请在与其相同的作用域中编写代码,否则您的代码将在控制权传递之前执行。 - Mani
@flix 好的,我明白你想解析令牌并在另一个API中使用它,最后将该响应导出。但是你不能这样做。你需要更改导入此文件的文件以解决问题。除非更改了导入此文件的方式,否则无法按照你的要求形成时间线。我正在编辑代码。 - Mani
你需要修改导入当前文件的文件,以解决问题。那我怎么做呢? - flix
我遇到了一个错误 undefined is not a function (evaluating '_Axiosx.default.post('User/CheckCurrentLogin', item)'),我应该怎么做? - flix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接