jQuery promise().done() не работает

jQuery promise().done() не работает. Ниже мой код:

<div id="testtesttest">gggggg</div>
<script type="text/javascript">
    Event.observe(window, 'load', function() {
        new Ajax.Request('testurl', {
            method: 'get',
            parameters: {
                id: param
            },
            onSuccess: function() {
                alert('success');
                jQuery('div#testtesttest').html('teststring').promise().done(function() {
                    alert('afterpromise');
                });
            }
        });
    });
</script>

Он сообщает "success", заменяя "teststring" на "gggggg", но не предупреждая "afterpromise".

Я использую jquery-1.10.2.

Отредактировано: Исходный код

<?php if (!$this->getAttributeCode() || $this->getProduct()->getData($this->getAttributeCode())): ?>
    <div id="<?php echo $this->getBlockId() ?>" class="lazyblocks-loader">&nbsp;</div>
    <script type="text/javascript">
        Event.observe(window, 'load', function(){
            new Ajax.Request('<?php echo $this->getUrl('lazyblocks/product/' . $this->getLazyAction()) ?>', {
                method: 'get',
                parameters: {
                    id: <?php echo $this->getProductId(); ?>
                },
                onSuccess: function(transport){
                    var data  = transport.responseText;
                    var block = jQuery('#<?php echo $this->getBlockId() ?>')
                    block.removeClass('lazyblocks-loader');
                    if (data.isJSON()) {
                        var jsonData = data.evalJSON();
                        if (jsonData.html) {
                            block.html(jsonData.html).promise().done(function(){
                                block.find('img.lazy').jail({
                                    id              : 'page',
                                    event           : 'load+scroll',
                                    loadHiddenImages: true,
                                    offset          : 10000
                                });
                                <?php echo $this->getChildHtml('lazyblocks.loader.oncomplete'); ?>
                            });
                        }
                    }
                }
            });
        });
    </script>
<?php endif; ?>

В чем может быть проблема?


person murtza gondal    schedule 10.06.2014    source источник
comment
Что должно делать это обещание? В нем нет асинхронного вызова   -  person Denys Séguret    schedule 10.06.2014
comment
html() является синхронным, ему не нужен обратный вызов, обещание или что-то в этом роде.   -  person adeneo    schedule 10.06.2014
comment
Почему бы не поместить весь код onSuccess в .done?   -  person TimSPQR    schedule 10.06.2014
comment
чтобы сделать обновленный div частью DOM, мне нужно запустить ленивую загрузку после обещания. Но не знаю, почему обещание не выполняет его работу и возвращает контроль мне.   -  person murtza gondal    schedule 10.06.2014
comment
.done тоже не работает   -  person murtza gondal    schedule 10.06.2014
comment
Конечно, это не работает, обещание не к чему прикрепить, html() не возвращает отложенное.   -  person adeneo    schedule 10.06.2014
comment
вам не нужно обещание. .html() является синхронным.   -  person Kevin B    schedule 10.06.2014
comment
Вызов $().promise для объектов jQuery работает только для методов, выполняющих асинхронную работу, таких как анимация. $.html не возвращает то, что можно превратить в обещание   -  person Juan Mendes    schedule 10.06.2014
comment
@JuanMendes или Кевин, или аденео, или дистрой, один из вас должен опубликовать это как ответ.   -  person Benjamin Gruenbaum    schedule 10.06.2014
comment
Ребята, взгляните на документацию: Использование .promise() для коллекции без активной анимации возвращает обещание разрешено. Код спрашивающего должен работать.   -  person Frédéric Hamidi    schedule 10.06.2014
comment
код в отредактированном разделе работает для более старой версии magento, я только что обновился до EE, и ленивая загрузка не работает. Когда я предупреждаю что-то в старом коде после строки обещания, это работает, но не в версии EE. Оба имеют одинаковую библиотеку jquery   -  person murtza gondal    schedule 10.06.2014
comment
@FrédéricHamidi Да, это будет работать, но не будет делать то, что он думает, и совершенно не нужно.   -  person Kevin B    schedule 10.06.2014
comment
Связано: stackoverflow.com/questions/1773875   -  person Kevin B    schedule 10.06.2014
comment
@murtzagondal э-э... Думаю, так и будет.   -  person Benjamin Gruenbaum    schedule 10.06.2014
comment
@BenjaminGruenbaum, к сожалению, он не работает, не знаю почему.   -  person murtza gondal    schedule 10.06.2014
comment
@murtzagondal создайте автономный пример скрипта на jsfiddle.net, иллюстрирующий проблему. До тех пор неясно, голосование за закрытие как «отладка без воспроизводимого образца»   -  person Benjamin Gruenbaum    schedule 10.06.2014
comment
@ Кевин, я не говорил обратного (в основном потому, что понятия не имею, чего на самом деле хочет спрашивающий). Однако код в обработчике done должен работать. Может быть, слишком рано, но все же следует. Если это не так, проблема может исходить откуда-то еще.   -  person Frédéric Hamidi    schedule 10.06.2014
comment
Зачем отлаживать, почему разрешенное обещание не кажется разрешенным, если вам не нужно обещание?   -  person Kevin B    schedule 10.06.2014
comment
@KevinB Я знаю ... но дело в том, что это должно работать. Оказывается, это работает в jQUery 2.1+ Смотрите мой ответ   -  person Juan Mendes    schedule 10.06.2014
comment
@BenjaminGruenbaum Пожалуйста, посмотрите мой ответ и рассмотрите возможность удаления вашего голоса, чтобы закрыть   -  person Juan Mendes    schedule 10.06.2014


Ответы (1)


Проблема в вашей версии jQuery. Если вы используете более позднюю версию (2.1 и выше), она будет работать. В последней версии элементы jQuery создают разрешенное обещание, если нет ожидающих выполнения асинхронных операций. Видеть

Какой-то поддельный код, чтобы я мог ссылаться на jsfiddle

// Fake code so I can link to jsfiddle
person Juan Mendes    schedule 10.06.2014
comment
Я считаю, что @FrédéricHamidi верен, и мой код должен работать, но он не работает :( - person murtza gondal; 10.06.2014
comment
цель обещания здесь в том, что мне нужно запустить ленивую загрузку, которая работает только с элементами DOM, мои запросы ajax возвращают данные о продуктах, и их изображения должны загружаться с использованием библиотеки для тюрьмы, но обещание не передается - person murtza gondal; 10.06.2014
comment
@murtzagondal Ваш комментарий очень сложно расшифровать. Если у вас есть дополнительная информация, опубликуйте ее в своем вопросе. Опубликуйте код, который вы используете. Я уже говорил вам, в чем проблема с вашим кодом. - person Juan Mendes; 10.06.2014
comment
да, я только что прочитал ваш обновленный ответ, спасибо, позвольте мне обновить jquery, я опубликую, если это сработает - person murtza gondal; 10.06.2014