Synchronous FIFOs have only a single clock for both Read and Write operations. Here, it is relatively easy to determine the FIFO depth and also to generate the Full and Empty flags.
However, in an Asynchronous FIFO, both the Read and Write operations are performed at Different Clocks. Hence you need to pay special attention to determine the depth of these FIFOs. More over, to generate the full and empty flags you need to synchronize the read and write pointers before comparing them.