Javascript 在多个函数中等待相同的API调用

Javascript 在多个函数中等待相同的API调用,javascript,promise,async-await,Javascript,Promise,Async Await,我有一个API调用,我想在一个函数中调用,但在另一个回调中等待 例如,我想在加载时发出GET请求,以便数据尽快可用,但我需要一个提交函数来等待GET请求,以便在数据可用之前它不会触发 这是由于我在两个异步函数之间有一个竞争条件,其中根据API响应时间,可能比具有控制逻辑的身份验证回调花费更多或更少的时间 我宁愿同时执行两个调用,以便在任何情况下都能尽可能快地运行。我知道这会带来更高的成本,因为数据可能不会被使用,但在初始连接时,每个会话只会执行一次,因此加载时间的潜在减少值得额外的API调用 也

我有一个API调用,我想在一个函数中调用,但在另一个回调中等待

例如,我想在加载时发出GET请求,以便数据尽快可用,但我需要一个提交函数来等待GET请求,以便在数据可用之前它不会触发

这是由于我在两个异步函数之间有一个竞争条件,其中根据API响应时间,可能比具有控制逻辑的身份验证回调花费更多或更少的时间

我宁愿同时执行两个调用,以便在任何情况下都能尽可能快地运行。我知道这会带来更高的成本,因为数据可能不会被使用,但在初始连接时,每个会话只会执行一次,因此加载时间的潜在减少值得额外的API调用

也就是说,以下是我目前正在做的事情:

  let initialized = false;
  let dataError = null;
  let dataWaiters = [];
  const dataLoaded = () => new Promise(( resolve, reject ) => {
    if ( initialized ) resolve();
    if ( dataError ) reject( dataError );
    dataWaiters.push({ resolve, reject });
  });
这允许我在加载时发出axios get请求,然后解决dataWaiters中的任何/所有承诺

然后在另一个回调函数中,我可以简单地使用wait dataLoaded延迟执行,直到这个请求完成

async onSomeCallback( data ) {
  if ( useTempToken ) {
    await dataLoaded();
    // use token...
  else {
    // use data...
  }
}

这是可行的,但我觉得应该有一种方法可以更好地使用axios.get promise,并且可能使用更少的“全局”变量。有什么方法可以让我更优雅地处理这个问题吗?

这里是一个非常简单的例子。 我们宣布一个新事件。 然后,我们的数据加载器在准备就绪时进行调度。 我们有一个触发两个动作的事件侦听器

常量数据=[]; const dataReady=new CustomEvent'dataReady'{ 泡泡:是的, 详情:数据 }; 常量populateData==>{ 设置超时=>{ fori=0;i<10;i++data.pushi; console.log'test2'; document.dispatchEventdataReady; }, 3000; }; document.addEventListener'DataReady',{detail}=>{ console.logdetail; }; document.addEventListener'DataReady',{detail}=>{ log`Array length:${detail.length}`; }; 种群数据;
console.log'Test';我有点困惑。。。第二个异步调用在哪里?看起来第二个代码块中只有一个。另外,saveResponse来自哪里?并在同一上下文中运行testoken?@djfdev onStart和onSomeCallback。onStart在加载/装载时启动,onSomeCallback在firebase对用户进行身份验证后运行。如果用户没有经过身份验证,我需要向另一台服务器发送临时身份验证以访问数据。不过,我不想等到firebase返回后再获取临时身份验证,而且如果没有临时身份验证或用户身份验证,我无法运行onSomeCallback函数。什么是saveResponse?Firebase的逻辑在哪里?示例代码似乎不完整。查看onSomeCallback函数的实际调用位置会很有帮助。它是不完整的,我去掉了不相关的逻辑,因为我只对一种方法感兴趣,在这种情况下,在多个位置等待一个承诺,一个get请求。数据传递的方式和相关的firebase函数并不相关,只是我所拥有的用例的一个例子。对我来说,这看起来很合乎逻辑。ThanksNo问题快乐编码:
async onSomeCallback( data ) {
  if ( useTempToken ) {
    await dataLoaded();
    // use token...
  else {
    // use data...
  }
}