我有一个使用回调工作的库(假设我无法编辑该库的功能)。
我希望能够知道是否已经调用了回调,如果没有,则执行某些操作。
这是一个快速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,但这根本不稳定......
你可以创建两个promises,一个包装你的回调,另一个在一段时间之后抛出,然后让它们竞争:
const timeout = time => new Promise((_, reject) => setTimeout(reject, time));
const result = Promise.race([
new Promise(getUser),
timeout(1000)
]);
result.then(/*..*/).catch(/*...*/)
但实际上,如果出现问题,API(getUser
)也应该回调错误。