函数通过循环迭代,只工作一次,不再工作

function iterates through loop and works once but never again

本文关键字:工作 不再 一次 循环 迭代 函数      更新时间:2023-09-26

我正在调用一个钛合金模态窗口打开,然后运行一个函数,循环通过一些数据,像这样;

窗口1:

var win = Ti.UI.createWindow({
    url: 'window2.js'
    modal: 1
});
win.open();

窗口2:(从窗口1调用)

win = Ti.UI.currentWindow;
function doLoop() {
    Ti.API.info('doLoop fn called');
    // I've tracked the issue down to here
    var m = 0;
    for(var i in list) { m++; }
    Ti.API.info(m);
    Ti.API.info('finished');
}
win.addEventListener('open', function() {
    // list is dynamically generated and passed through successfully from window1.js
    doLoop();
});

每次都成功调用doLoop(),每次都成功调用list。

第一次运行时效果很好。第二次(任何不是第一次的)运行时,需要时间暂停并运行循环,但m永远不会增加?循环暂停后输出'finished'。

任何想法?

function buildMediaItemsSelectionTable() {
    var mediaCount = 0, i;
    for(i in mediaItemsSelectionList[0]) { mediaCount++; }
    for(i=0,l=mediaCount;i<l;i++) {
        addMediaItemsSelectionSongsRow(i);
    }
}

我在这里看到了几个问题。

首先,buildMediaItemsSelectionTable()函数的问题

  1. 你的for..in循环可能会捕获你不需要的对象属性
  2. 不需要双循环

这里是那些适当的修改

function buildMediaItemsSelectionTable()
{
  var i = 0, p;
  for ( p in mediaItemsSelectionList[0] )
  {
    if ( mediaItemsSelectionList[0].hasOwnProperty( p ) )
    {
      addMediaItemsSelectionSongsRow( i++ );
    }
  }
}

另一个问题是我不得不猜测,因为你没有提供足够的代码。我假设你用钛的变量转发将list传递给模态。也许是这样的?

var win = Ti.UI.createWindow({
    url:   'window2.js'
  , modal: 1
  , list:  [1,2,3]
});

必须有东西反复打开模态,对吧?也许是一个按钮

var button = Ti.UI.createButton( {title: 'Modal'} );
Ti.UI.currentWindow.add( button );
button.addEventListener( 'click', function()
{
  win.open();
});

但是根据你的描述,list会改变所以让我们制作一个随机列表生成器并将其插入到我们的页面中所以整个东西看起来像这样

var win = Ti.UI.createWindow({
    url:   'window2.js'
  , modal: 1
  , list:  randomList()
});
var button = Ti.UI.createButton( {title: 'Modal'} );
Ti.UI.currentWindow.add( button );
button.addEventListener( 'click', function()
{
  win.open();
});
function randomList()
{
  // Random return an array with 3, 5, or 7 items
  return [[1,2,3],[1,2,3,4,5],[1,2,3,4,5,6,7]][Math.floor(Math.random()*2)];
}

怎么了?无论打开模式多少次,randomList()都只被调用一次。即使window1是nav或tab组的一部分,创建模态窗口的代码在任何情况下都不会重新执行。

如果你想让一个新列表每次都被转发到模态,你必须每次都生成一个新的

button.addEventListener( 'click', function()
{
  win.list = randomList();
  win.open();
});

看起来你的"}"放错地方了。现在你的循环有一个单一的(可能是无意的)副作用——m计数到列表的长度,然后调用API.info来计算列表的长度。

您可能需要:

function doLoop() {
    Ti.API.info('doLoop fn called');
    // I've tracked the issue down to here
    var m = 0;
    for(var i in list) { 
        m++;
       Ti.API.info(m);
       Ti.API.info('finished');
    }

}