0

我正在寻找 _.after 函数只是为了玩它。

var renderPoin = _.after(data.models.length, function() {
 console.log( 'siap' );
 require(["ftscroller"], function () {
   $('.dedo').css('width', $li_width);
    var containerElement, scroller;                                     
    containerElement = document.getElementById('poin-nav');                                             
    scroller = new FTScroller(containerElement, {
       scrollbars: false,
       scrollingY: false,
       snapping: true,
       scrollResponseBoundary: 8,
       scrollBoundary: 0
       //contentWidth: $li_width
    });
  });
});


_.each(data.models, function (poin, i) {
  db.transaction(function(trans) {
        trans.executeSql("insert into piezo_point(id, nama, lat, lng) values(?,?,?,?)", [poin.get('id'), poin.get('nama'), poin.get('lat'), poin.get('lng')]);                                      
  }, self.errorCB, function() {
      self.viewList = new Poin({
            model: poin,
            vent: window.vent
  });
  self.$el.find('#poin-nav ul').append(self.viewList.render().el);
  $li_width += parseInt(self.viewList.$el.css('width'));
  if ( (i+1) === data.models.length){                                                       
    renderPoin;
  }
 });    
}, self);

但是上面的 renderPoin 没有按预期执行。我究竟做错了什么?

提前致谢

4

1 回答 1

1

我认为这只是一个错字。
您没有调用该renderPoin函数,因为您()在这部分代码中缺少括号:

if ( (i+1) === data.models.length){                                                       
    renderPoin;
}

更新
我什至不会争辩说您的代码甚至没有调用所需的函数。
看看官方文档

(_.after)... 创建仅在第一次调用count 次后才会运行的函数版本。

如果您也不相信文档,请尝试在浏览器控制台中运行这个简单的测试:

var f = _.after(1, function(){});
alert(typeof f); // and be amazed

更新#2
after函数的全部目的是将您的回调触发逻辑抛在脑后,只在每个循环上调用该函数。该_.after函数决定何时实际调用该函数,因此您可能会丢失if ( (i+1) === data.models.length){并仅用函数调用替换它:

_.each(data.models, function (poin, i) {
    db.transaction(function(trans) {
        trans.executeSql("insert into piezo_point(id, nama, lat, lng) values(?,?,?,?)", [poin.get('id'), poin.get('nama'), poin.get('lat'), poin.get('lng')]);                                      
    }, self.errorCB, function() {
        self.viewList = new Poin({
            model: poin,
            vent: window.vent
        });
        self.$el.find('#poin-nav ul').append(self.viewList.render().el);
        $li_width += parseInt(self.viewList.$el.css('width'));     
        // just call it!                                            
        renderPoin();
    });    
}, self);
于 2013-10-03T06:49:18.680 回答