使用StackOverflow Q& A线程作为示例 - 当您投票,投票或关注某个问题时,您可以看到UI快速响应该操作,并改变了一边的最高投票数。
我们怎样才能达到这个效果?如果将每个此类操作发送到后端进行处理并使用返回的响应来更新UI,您将看到缓慢的更新并感受到故障。但是如果在前端放置一些逻辑,你还需要在反映UI上的操作之前处理欺诈/滥用等问题,即 - 在更改上选票之前,不要需要先确保有效用户的有效点击是否有效?
答案 0 :(得分:2)
您确保有效用户在用户点击任何内容之前使用应用。这是通过身份验证完成的,它必须包含针对恶意用户的各种保护机制。
当用户点击时,会呼叫服务器。在正确构建的应用程序中,此调用是轻量级的,服务器响应非常快。我不知道你为什么相信这样做,你会看到一个缓慢的更新并感受到故障"。向数据库添加upvote最多需要几百毫秒(包括来自客户端的往返),特别是如果提交是异步的或者使用了memcache。
如果数据库更新导致需要执行一些复杂的操作,通常不会立即执行这些操作。例如,cron作业可能会定期运行以计算新的排名等,正是因为您不希望每个用户都等待。或者,创建任务并将其放入任务队列中,以便在资源可用时执行 - 再次确保用户不会等待。
在某些应用程序中,在服务器的任何响应到达之前,在对服务器进行调用之后立即更新UI。当呼叫失败的后果可以忽略不计时,您可以这样做。例如,如果upvote未能保存在数据库中,那么它不是灾难,特别是如果它在一百万次尝试中发生一次。同样,在正确构建的应用程序中,调用失败极少。
这是应用开发者需要做出的决定。我不会在服务器响应之前更新UI,如果这样的更新可能会导致用户认为现在可以执行其他操作。例如,如果用户上传了新照片,我就不会显示要编辑或分享此照片的图标,直到我知道照片已安全保存为止。