2

この質問は以前にもありましたが、問題の解決策がわかりませんでした。

次のコードがあります。

function mouseup (  )
{
    for( i = 0; i < 6; i++ )
    {
        setTimeout(function(){
            alert( "test" );
        },1000);
    } 
}

しかし、コードを実行すると、1 秒間の一時停止の後、ダイアログ ボックスが表示されます (当然のことです)。しかし、そのダイアログ ボックスで [OK] をクリックすると、2 番目のダイアログ ボックスが遅延なくすぐに表示されます。

jsFiddle の例

コードをあまり変更せずにこれを修正する簡単な方法はありますか? 私が尋ねる理由は、次のようなコードを変更するコンバーターを構築しているためです。

repeat 6 times
    wait for 1 second
    answer "test"
end repeat

上記のJavaScriptコードに変換し、コンバータープログラムをあまり変更したくない場合は、あまり変更したくありません。

よろしくお願いします。

編集: (疑問がある場合は、JavaScript 以外のコードは HyperTalk/xTalk コードです)

4

8 に答える 8

8
window.counter = 6;
function mouseup (  )
{
    setTimeout(function(){
        alert( "test" );
        if ( window.counter-- ) {
            mouseup (  );
        }
    },1000);
}
于 2014-04-04T14:21:34.610 に答える
1
function mouseup (  )
{
    var delay = 0;
    for( i = 0; i < 6; i++ )
    {
        setTimeout(function(){
            alert( "test" );
        },(delay += 1000));
    } 
}
于 2014-04-04T14:21:52.450 に答える
1

ここにはすでにいくつかの解決策がありますが、別の解決方法を示したいと思います。(このコードはエラーをテストしません。何ができるかを理解するためのものです)

 function loop( from, to, callback, finished ) {
   var currIdx = from-1;

   function next() {
     currIdx++;
     if( currIdx < to ) {
       callback(currIdx, next, stop);
     } else {
       if( finished ) {
         finished();
       }
     }
   }

   function stop() {
     if( finished ) {
       finished();
     }
   }
   next();


 }


 loop( 0, 6, function( i, next, stop ) {
   console.log(i);

   setTimeout(function() {
     next();
   }, 1000);

 });

nextこれにより、 and/orコールバックを他の関数に渡すことができstop、非同期コードで簡単な方法でループを作成できます。より複雑なことについては、 whenjsのような promise ライブラリも参照することをお勧めします。

于 2014-04-04T14:59:23.400 に答える