Javascript 通过在JS中完成动画进行回调

Javascript 通过在JS中完成动画进行回调,javascript,animation,Javascript,Animation,我已经在JS中编写了生成动画帧的函数,我想通过完成动画来使用链接方式调用回调函数。为此,我编写了以下代码: var _proto = Array.prototype; var Animation = function( duration, callback ) { var begin = new Date(), delta, then = [] , cid = setInterval(function(){ delta = (new Date() - begin) / dur

我已经在JS中编写了生成动画帧的函数,我想通过完成动画来使用链接方式调用回调函数。为此,我编写了以下代码:

var _proto = Array.prototype;

var Animation = function( duration, callback ) {
 var begin = new Date(), delta, then = []
  , cid = setInterval(function(){
      delta = (new Date() - begin) / duration;
      delta > 1 && ( delta = 1 )
       callback( delta )
        if( delta === 1 ) { 
         clearInterval( cid );
          if( then.length ) {
           var i = 0;
             for( ; i < then.length; i++ ) {
              then[i].call( this )
            }
          }
        }
      }, 10 );
   return { 
     then : function(){
      _proto.push.apply( then , _proto.slice.call( arguments ) );
      return this;
    } 
  }
};
在这种情况下,创建“then”方法是一种好方法吗?或者你可以给出任何建议。

如果你有目标,你可以在没有任何库的情况下做出承诺。您的代码应该如下所示:

var Animation = function( duration, callback ) {
    return new Promise(function (fulfill, reject) {
        // Your code ...
        setInterval(function(){
            // More of your code ...
            if (something) {
                // When it's done ...
                fulfill()
            }
        }, 10)
    })
}

返回的promise对象应具有
then
方法。

这不支持promises库中常见的某些功能:如果在动画完成运行后调用then,则不会调用回调,则不会收到错误回调,等等。如果我是你,我会保持简单,并用原始回调编写动画。如果您想要
,那么可以使用许多Promission库中的一个,它们都提供了一种将回调代码转换为promise对象的方法。我想方法的名称表明我即将实现延迟对象。事实并非如此。这只是一个方法,必须在使用链接方式完成动画后调用。这有点像旧版jQuery中的成功。这是一个很大的品味问题,但我不太喜欢像你这样仅仅为了语法而使用链接。我更愿意保持它的简单性,并将回调作为常规参数传递。如果我希望能够在动画完成后添加回调(如果在开始时将回调作为参数传递,则这是不可能的),我只会使用单独的then方法对其进行编码。
var Animation = function( duration, callback ) {
    return new Promise(function (fulfill, reject) {
        // Your code ...
        setInterval(function(){
            // More of your code ...
            if (something) {
                // When it's done ...
                fulfill()
            }
        }, 10)
    })
}