Ошибка "Завещание уже выполнено" - PullRequest
4 голосов
/ 19 мая 2011

В настоящее время я тестирую различные асинхронные загрузчики ресурсов, чтобы увидеть, какой из них я хочу использовать. В настоящее время Curl выдает ошибку " Обещание уже выполнено " ... и в их документации говорится: "Этого никогда не должно быть".

Я «подозреваю», что должен использовать «определение» в каждом загружаемом файле (надеюсь, что нет). Кроме того, в их документации говорится, что Curl может работать с файлами JavaScript не AMD. Но ... Я новичок в AMD и с тех пор Curl на намного быстрее , чем другие, которые я тестирую ... Я готов поставить некоторое время, чтобы лучше понять это.

Наконец ...

Несмотря на то, что FireBug показывает ошибки ... все файлы все еще загружаются асинхронно! Но ПОТОМУ ЧТО есть ошибки ... часть кода затем никогда не вызывается.

Итак, мои вопросы:

  • Нужно ли обновлять все файловые объекты JavaScript, которые должны содержаться в определении? (... надеюсь, нет)
  • Можете ли вы увидеть любую другую проблему синтаксически?

Код руководителя выглядит следующим образом:

<script type="text/javascript">
    ///<summary>Configuration</summary>
    curl = { baseUrl: 'Includes/JavaScript/' };
</script>
<script src="Loaders/Curl/curl.js" type="text/javascript"></script>
<script type="text/javascript">

    function onSuccess() {
    }
    function onError(ex) {
        //alert(ex);
    }

    require(["MooTools/Core/mootools-1.2.2-core-jm",
        "MooTools/mGeneral",
        "jQuery/Core/jquery-1.3.2",
        "jQuery/Core/jquery.tools.min",
        "jQuery/ThirdPartyPlugIns/jquery.tmpl"])
        .then(onSuccess, onError);

    //require(["jQuery/TopUp/top_up-min"], null);

    require(["jQuery/ThirdPartyPlugIns/jquery.dimensions",
        "jQuery/ThirdPartyPlugIns/jQuery.Color.Animations",
        "jQuery/ThirdPartyPlugIns/jquery.corners.min",
        "jQuery/ThirdPartyPlugIns/jquery.tipsy",
        "jQuery/ThirdPartyPlugIns/jquery.numberformatter-1.1.0",
        "jQuery/ThirdPartyPlugIns/jquery.tipsy"]);

    require(["general",
        "WindowCenter",
        "ThirdPartyPlugin/KeyBoardCapture",
        "ThirdPartyPlugin/bsn.AutoSuggest_2.1.3",
        "ee/8Ball",
        "ee/EE"]);
</script>

Опять же ... Я уверен, что это вызвано неопытностью с кодом в стиле AMD, но мне все еще нужна помощь ... так что любой ценится.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Как правило, вы должны обернуть свои модули в define() или добавить define() в конце файла, если эти модули не имеют зависимостей. Кажется, однако, что все эти модули зависят от jQuery, если не от других модулей / файлов.

Поскольку вы не используете стандартный протокол AMD require() / define(), AMD на самом деле не помогает вам с этими модулями. Если вы не планируете писать свои собственные модули с использованием define(), то вы можете использовать практически любой асинхронный загрузчик.

Тем не менее, есть способ заставить curl.js работать с не-AMD модулями / файлами. Используйте JS! плагин. Вот ваш первый блок файлов, переведенных для использования js! Плагин (заметьте, я также добавил обратно ".js" ext, который мне нравится делать с немодулями):

// we load the core files first, then get the next block that depends on them
curl([
    "js!MooTools/Core/mootools-1.2.2-core-jm.js",
    "js!jQuery/Core/jquery-1.3.2.js"
]).next([
    "js!MooTools/mGeneral.js",
    "js!jQuery/Core/jquery.tools.min.js",
    "js!jQuery/ThirdPartyPlugIns/jquery.tmpl.js"
]).then(onSuccess, onError);

Если любой из этих файлов в каждом массиве зависит друг от друга, вы также можете использовать суффикс! Order для них, чтобы они ожидали других файлов перед выполнением / оценкой (хотя убедитесь, что вы устанавливаете правильные заголовки кэша) , На самом деле суффикс! Order - это самый быстрый метод, если нет проблем с кэшированием (мобильные браузеры добавляют некоторые дополнительные ограничения на размер файла).

Были ли другие сообщения об ошибках? В частности, я ожидаю, что curl.js выдаст хотя бы одну ошибку, кроме просто «Обещание не выполнено».

Также, пожалуйста, проверьте вкладку Net (Firebug) или вкладку Network (Chrome), чтобы убедиться, что curl.js ищет правильное местоположение для модулей.

FWIW, я планирую удалить псевдоним require -> curl. Причина в том, что глобальная функция require не является стандартной (и явно не стандартизирована в предложении AMD). Я предлагаю вам использовать curl() вместо require().

curl.js также позволяет явно указывать псевдоним API верхнего уровня через параметр конфигурации «apiName», если вы действительно хотите использовать имя «require». :)

<script>curl = { apiName: "require" }; </script>
<script src="path/to/curl.js"></script>
<script>require(["some/modules"]).then(success, failure);</script>

Больше FWIW: стандарт require обычно требуется только в модуле и может быть запрошен путем включения его в качестве зависимости:

define(["require"], function (require) {
    require(["another/module"], function (another) {
        // use another module here
    });
});

- Джон

0 голосов
/ 19 мая 2011

Если вы выполняете только обычную загрузку файлов javascript (не модулей), как кажется, я бы посоветовал вам проверить LABjs (http://labjs.com). LABjs фокусируется на том, чтобы быть наиболее оптимизированным решением для загрузки (для исключение некоторых других функций, таких как стиль модуля / зависимости).

На самом деле, LABjs 2.0a (https://github.com/getify/LABjs/blob/master/next/LAB.src.js),, который будет полностью выпущен в течение следующих нескольких дней, действительно исключительно быстр (даже более 1,2) при параллельной загрузке общих сценариев. Я рекомендую вам дать его попытка, если (как Джон ускользает от вышеупомянутого) вы не планируете использовать синтаксис модуля ... затем придерживаться Curl или RequireJS.

...