$ .when不适用于$ .scrollTo插件

时间:2013-08-11 20:00:19

标签: javascript jquery

我使用scrollTo插件,我希望在工作警报功能之后滚动我想要的位置。我的原型代码就是这样。它不起作用,我的错误是什么?

 $.when(function () {
        $.scrollTo('#documentsFieldset', 1000);
    }).done(function () {
        alert('completed');
    });

2 个答案:

答案 0 :(得分:2)

$.when仅接受deferredspromises。不幸的是,$.scrollTo没有返回任何内容,undefined,因此无法正常工作。

当你尝试将$.scrollTo的结果传递给$.when时,它会原谅你并将其视为“没有给予承诺”,并立即承诺。因此,您的done回调会立即被调用,并且不会等待滚动完成。

一种解决方案是将回调作为第三个参数传递,或将其设置为第三个参数的onAfter属性:

$.scrollTo('#documentsFieldset', 1000, function() {
    alert('completed');
});
// or alternatively, e.g. if you need to pass more settings
$.scrollTo('#documentsFieldset', 1000, {
    onAfter: function() {
        alert('completed');
    }
});

另一个解决方案是在$.scrollTo周围创建一个包装器,它返回一个promise,这样你就可以在$.when调用中愉快地使用它来将它与其他异步内容结合起来。我继续尝试,go check out the fiddle

答案 1 :(得分:0)

您已在匿名函数中将scrollTo的调用包装,该函数不返回延迟对象。 如果您只想在完成scrollTo时做出反应,则以下就足够了:

$.when(
       $.scrollTo("#selector", 1000)
).done(function(){
     console.log("scroll finished");
});

<击> 编辑: 我错误地认为$ .scrollTo会返回一个延迟对象 - 它不会! 但是API提供了回调。 所以解决方案看起来像这样:

$.scrollTo("#selector", 1000, {
   onAfter: function() {
      console.log("done!");
   }
});