jQuery从数据库到数组的多个get() - 好主意?

时间:2011-07-23 09:52:48

标签: php jquery mysql get

我正在尝试为一些带有章节的书籍制作一个“幻灯片”浏览器。 “幻灯片”是存储在数据库中的大量HTML数据。一章可以包含50-100张幻灯片,但它们非常小(每张1-2 kB,有些是图片)。我希望用户可以点击上一张和下一张幻灯片的按钮,并最大限度地减少加载时间。

我现在拥有一个名为ContentFetcher.php的PHP页面,它只查询数据库以获取一张幻灯片(部分)的内容。

<?php
require_once 'Database.php';
echo Database::getInstance()->getSectionText($_GET["bookID"], $_GET["chapter"], $_GET["section"]);
?>

我的Javascript运行循环并使用$.get()获取当前章节的每个部分:

        $(function() {                                
            <? $db = Database::getInstance(); ?>

            var chapterSize = <?= $db->getChapterSize($this->bookID, $this->chapter) ?>;
            var chapterContent = []; // this is where I want to store the contents
            var currentSection = <?=$this->section;?>;

            for (var i = 1; i <= chapterSize; i++) {
                $.get("ContentFetcher.php", { 
                    bookID  : <?= $this->bookID  ?>,
                    chapter : <?= $this->chapter ?>,
                    section : i
                }, function(data) {
                 chapterContent.push(data);
             });
           }

        $("#slides").html(chapterContent[currentSection]); // show the current slide

     });

这是一个表现明智的好主意吗?如果是这样,我对JS闭包的理解还不是那么好 - 我如何在闭包中访问相同的chapterContent

2 个答案:

答案 0 :(得分:2)

这个想法意味着您将在50到100个HTTP请求之间加载一个章节;这些都将在几乎同时完成。

因此,每当有人试图加载章节时,您的网络服务器将在几秒钟内收到100个请求 - 可能不是一个好主意。


在这种情况下,我可能会尝试实现这样的事情:

  • 当用户打开章节时,执行单个HTTP请求,该请求将返回前10个幻灯片
  • 当用户到达幻灯片8时,执行单个HTTP请求,以加载幻灯片11到20
  • 当用户到达幻灯片18时,执行单个HTTP请求,以加载幻灯片21至30
  • 等等

当然:

  • 如果用户通过键入其URL(如果可能)或使用某些“goto slide X”功能到达幻灯片56,则必须执行HTTP请求以加载幻灯片51到60.
  • 这意味着如果用户从幻灯片到幻灯片过快,则可能需要等待一段时间。


它会使您的客户端和服务器端代码更复杂,但它可能是最好的解决方案之一:

  • 您不会一次加载太多数据,
  • 您不会预先加载太多数据,
  • 您不会做太多的HTTP请求,
  • 这些将提前完成,因此用户无需等待新幻灯片到达。

答案 1 :(得分:0)

不,这绝对不是一个好主意。我建议你只需要一个$ .get()请求来接收JSON数组中的所有记录。

关于闭包,你必须观看优秀的Douglas Crockfords的视频"The JavaScript Programming Language" (4 parts)。是的,闭包可以这样使用,它们很棒。