【问题标题】:Check if a callback is being called检查是否正在调用回调
【发布时间】:2019-04-25 18:54:49
【问题描述】:

我有一个使用回调来工作的库(假设我无法编辑该库的函数)。

我希望能够知道是否调用了回调,如果没有,请执行一些操作。

这是一个快速的 MCVE 来揭露我的问题:

const networkError = false;

(function() {
  getUser(name => console.log('Username is', name));

  if(!'Some condition that says if the callback failed')
    console.log('Network error, can not fetch name');
})();

function getUser(callback) {
  if (!networkError) callback('John Doe');
}

最终目标是管理身份验证。我想测试用户是否已连接,如果没有,则重定向到另一个页面用户不会看到记录的页面内容。到目前为止,我发现的只是在回调中使用带有布尔值的 Timeout,但这根本不稳定......

【问题讨论】:

  • 回调是同步调用还是异步调用。如果是异步的,你想等待执行多长时间?
  • 哪个函数不能在getUser中编辑getUser或callback?
  • @Ashish 它是异步的,我想让它同步(如果可能的话),这样我就不必玩超时了。
  • @ducmai 我可以编辑回调,而不是 IIFE 之外的函数。
  • @tricheriche 您已经告诉过您只能修改回调函数,而不能修改调用回调的函数,因此如果行为是异步的。你不能让它同步。

标签: javascript callback asynccallback


【解决方案1】:

你可以创建两个 promise,一个包裹你的回调,另一个在一定时间后抛出,然后让它们竞争:

 const timeout = time => new Promise((_, reject) => setTimeout(reject, time));

const result = Promise.race([
  new Promise(getUser),
  timeout(1000)
]);

result.then(/*..*/).catch(/*...*/)

但实际上,如果出现问题,API (getUser) 也应该返回一个错误。

【讨论】:

  • 这就是问题所在,我不想使用超时。如果我这样做,用户将能够在被重定向之前瞥见页面。
  • 那你的 API 坏了。
  • 也许不是 API,但绝对是过程。不过,感谢您的意见,我会尝试谈判以避免该解决方案!
猜你喜欢
  • 2020-06-30
  • 2019-05-16
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2019-11-27
  • 2020-07-15
  • 2010-12-17
相关资源
最近更新 更多