2016-07-15 48 views
1

我正在编写一个使用缓存系统的nodejs/reactjs应用程序。 我遇到了一个错误,其中缓存中的数据从未被组件显示,我最终发现cache.isEmpty()这行应该是cache.isempty()。 在这种情况下,Javascript并没有抛出任何错误,只是停止执行。另一方面,如果我在其他地方打电话,在if语句之前说,它通常会抛出一个错误,并告诉我该函数没有被定义。这是为什么?Javascript在调用未定义的函数时不会引发错误

read: function (apiCall, data, cacheKey, ttl, putQuery, retrieveQuery) { 
     if (cache.expired(cacheKey, ttl)) { 
      console.log('cache is expired'); 
      api.call(apiCall,data, (response) => { 
       console.log(response); 
       db[putQuery](response); 
       db[retrieveQuery](data, (result) => { 
        cache.set(cacheKey, result); 
        cache.refresh(cacheKey); 
        render(); 
       }); 
      }); 
     } else if (cache.isEmpty()) { 
      console.log('cache is empty'); 
      db[retrieveQuery](data, (result) => { 
       cache.set(cacheKey, result); 
       render(); 
      }); 
     } 
     console.log('cache is ready'); 
    }, 

让我知道你是否需要更多的细节。

编辑:只是为了说清楚,两种情况之间的唯一区别是有一次函数在else if语句中调用,而另一次不是。在这两种情况下,调用发生的方式相同

+2

*“JavaScript不是在这种情况下,抛出任何错误,但简单地停止执行。” *是的,它是。但是无论这个功能是在吃什么。 –

+0

调用'undefined'作为一个函数将会*总是抛出一个错误。在发展的过程中,必须有某种处理/抑制它的东西。你应该追踪错误并找出发生的地方。 –

+0

@ T.J.Crowder为什么它会显示它,如果我在if语句之外执行它? –

回答

1

在这种情况下,Javascript并没有抛出任何错误,只是简单地停止执行。

是的,它是,它抛出一个TypeError,因为你试图调用undefined,这是不可调用的。但是,无论是哪种函数调用都是为了例外而不是提供给您(或者以您的代码无法检查的方式提供给您)。

因此,解决方案是检查任何调用您的代码的文档,看它是否以不同的方式报告错误。这很常见,因为异常跟踪不会跨异步边界传播。

这里的东西吃的例子/抑制异常:

function foo(obj) { 
 
    obj.undefinedMethod(); 
 
} 
 
try { 
 
    foo({}); 
 
} catch (e) { 
 
    console.log("Got an error"); 
 
} 
 

 
// But if the caller suppresses it, converting it to 
 
// something else... This example converts it to a return value 
 
function bar() { 
 
    try { 
 
    foo({}); 
 
    return true; 
 
    } catch (e) { 
 
    return false; 
 
    } 
 
} 
 
console.log("Before calling bar"); 
 
bar(); 
 
console.log("After calling bar");

+0

准确地说,它被吃掉了,并且不可用于预定的地方或原始呼叫者。对我来说,错误发生在Promise的'then()'内部,它被catch()'捕获。我花了几个小时来追踪这个,因为我没有在catch()中打印错误信息,以知道它已经被使用,所以它不会传播回原来的调用者。再次感谢。 – haxpor

相关问题