Javascript 如何从函数外部调用函数内部的函数?

Javascript 如何从函数外部调用函数内部的函数?,javascript,json,fetch,Javascript,Json,Fetch,我有一个函数可以执行获取和处理这些数据: async function fetchData(){ const res = await fetch("./data.json"); const data = await res.json(); // processing one-time code function doSome() { // code that looks for something in data and processes it(I'

我有一个函数可以执行获取和处理这些数据:

async function fetchData(){
    const res = await fetch("./data.json");
    const data = await res.json();

    // processing one-time code

    function doSome() {
    // code that looks for something in data and processes it(I'm going to call this function many times)
    }
    doSome()
}
fetchData();
我可以在fetchData内部调用doSome函数,但我需要在fetchData外部调用doSome函数


我怎么能不处理一次性代码而只运行doSome呢?

内部功能范围仅限于外部功能。因此,它不能从外部调用,类似于从函数内部声明的变量。

似乎有两个独立的操作,其中一个的输出是另一个的输入。所以,做两个独立的函数,你会得到更干净的代码

async function fetchData(){
    const res = await fetch("./data.json");
    const data = await res.json();

    return data;
}
const json = fetchData();


function doSome(json) {
    // code that looks for something in data and processes it(I'm going to call this 
     function many times)
}

doSome(json);
doSome(json);
doSome(json);
doSome(json);
如果您想将它们一起发布,您可以将它们封装在JSON/对象中。只导出正确的方法,并保留一个包含JSON的全局(到此文件)变量

    let json = {};
    async function fetchData(){
        const res = await fetch("./data.json");
        const data = await res.json();
        json = data;
    }


  function doSome() {
  console.log(json);
        // code that looks for something in data and processes it(I'm going to call this 
         function many times)
    }

   //You probably want to call this from the outside, not in this file.
   doSome();
   doSome();
   fetchData();
   doSome();
   doSome();

   //not sure what is your functionality, so not sure what you would need to export here
   export default {
       fetchData,
       doSome
   }

因此,我将doSome从fetchData的作用域删除到模块的作用域中。然后,我更改了fetchData以返回数据,以便稍后使用该结果。一旦解析,它将设置变量
数据
,您可以重新使用它,并在
然后
回调中执行任何必需的操作。根据您的需要,您可以在那里添加事件侦听器,也可以在事件解析后对事件进行排队并触发需要数据的处理程序。希望这有帮助

使doSome成为一个闭包,并从方法返回它

async function fetchData() {
  // do your fetch logic
  const doSome = () => {
    // logic
  };

  return doSome;
}

const doSome = await fetchData();
doSome();

闭包将确保您保留在其中声明的包装方法的正确上下文,确保它可以访问在fetchData方法上下文中声明的属性

您可以将函数传递给
fetchData
,然后将其作为参数访问,等待完成后可以调用该参数。当您在函数外部调用该函数时,它应该使用哪个
data
?将
数据作为参数传递给
doSome
有意义吗?如果是这样的话,您可以简单地将其转换为一个普通的外部函数,然后从
fetchData
调用它,并将其作为参数反复传递给
data
,我遇到了fetch的最大问题。我要么需要使用.then放置一个通配符链,要么在1函数中执行所有操作(json在doSome中处理)我不知道如何保存fetch中的数据,以便以后在外部函数中重用。您使用的是需要polyfill的浏览器,还是使用native
fetch
?使用fetchconsole的最新FF和最新chrome。记录您的响应并进行调整,我不知道您使用的是什么ajax库以及服务器返回的内容。请注意,我更改了代码,删除了第二个等待,这可能是错误的。忘记添加符号我尝试了您的第一个选项,
console.log(json(或数据))
返回了承诺而不是json。如果res.json()返回了承诺,请添加回等待或使用.then(()=>{})方法来处理承诺。请告诉我,在这种情况下,如何从函数中获取json?SyntaxError:await仅在异步函数和异步生成器中有效-在线使用doSome=await fetchDataYou必须具有顶级异步方法,或者必须围绕编写的代码进行简单的异步函数包装。
async function fetchData() {
  // do your fetch logic
  const doSome = () => {
    // logic
  };

  return doSome;
}

const doSome = await fetchData();
doSome();