2017-06-05 10 views
1

私は、3つの異なるテキスト行を持つdivに入力テキストを入れようとしています。だから、私は関数の1行目をtyped_text()を呼び出して、2行目、3行目のためにもう一度呼び出したいと思います。私は約束を使用しようとしましたが、setTimeout()と再帰を使用すると失われました。非同期再帰関数を互いに呼び出す方法はありますか?

私はこのような関数を呼び出します。

typed_text("#line_one", frame.text_one, 0, 25) 
     typed_text("#line_two", frame.text_two, 0, 25) 
     typed_text("#line_three", frame.text_three, 0, 25) 

     function typed_text(div, text, index, interval) 
     { 
      if (quit_typed_text == true) { 
       interval = 0; 
      } 
      if (index < text.length) { 
       $(div).append(text[index++]); 
       setTimeout(function() {typed_text(div, text, index, interval); }, interval); 
      } else { 
       click_disabled = false; 
      } 

     } 

編集:ここでは、私は、再帰を使用しようとしたものであると約束

typed_text("#text_one", frame.text_one, 0, 25).then(typed_text("#text_two", frame.text_two, 0, 25)); 

function typed_text(div, text, index, interval) 
{ 
    return new Promise(function (resolve) { 
     if (quit_typed_text == true) { 
      interval = 0; 
     } 
     if (index >= text.length) { 
      click_disabled = false; 
      resolve(); 
     } 
    }).then(function() { 
     if (index < text.length) { 
      $(div).append(text[index++]); 
      /* Problem is here, setTimeout.then() does not exist as a function */ 
      setTimeout(function() {typed_text(div, text, index, interval); }, interval); 
     } 
    }); 
} 
+0

を '私はpromises'を使用しようとした - doesnのそれのように見えません –

+0

私は約束を使って私のコードを投稿しませんでした。どこで再帰を行っているのか分かりませんでした。再帰のためでない場合、私は解決策が働いたと思います。それが役に立たなければ、私が持っていたものを分かち合うことができます – Chris

答えて

0

、次のように単に約束チェーンを使用します。

typed_text("#line_one", frame.text_one, 0, 25).then(function() { 
    return typed_text("#line_two", frame.text_two, 0, 25); 
}).then(function() { 
    return typed_text("#line_three", frame.text_three, 0, 25); 
}).then(function() { 
    // all done here - perhaps this is where click_disabled = false should be? 
}); 
+0

非常に有望ですね、ありがとう!私は 'doit'に問題がありますが。この関数を呼び出すようには見えません。つまり、console.log( 'entered')を関数の最初の行に置き、決して呼び出されないようです。 – Chris

+0

はい、私は行を省略! 'doit'への最初の呼び出し:p –

+0

魅力のように動作します、ありがとう! – Chris

0

あなたのコードには、非同期関数がありませんようですので、なぜあなたはあなたの関数「typed_text」を呼び出すことはありませんsetTimeOut?例によって

setTimeout(function() { typed_text("#line_one", frame.text_one, 0); }, 25); 
setTimeout(function() { typed_text("#line_two", frame.text_two, 0); }, 50); 
setTimeout(function() { typed_text("#line_three", frame.text_three, 0); }, 75); 


function typed_text(div, text, index){ 
    if (quit_typed_text == true) interval = 0; 
    if (index < text.length) $(div).append(text[index++]); 
    else click_disabled = false; 
} 

これはあなたのためにOKだろうか?その後

function typed_text(div, text, index, interval) { 
    return new Promise(function(resolve) { 
     var doit = function() { 
      if (quit_typed_text == true) { 
       interval = 0; 
      } 
      if (index < text.length) { 
       $(div).append(text[index++]); 
       setTimeout(doit, interval); 
      } else { 
       click_disabled = false; // not sure this should be here 
       resolve(); 
      } 
     }; 
     doit(); // oops forgot this line 
    }); 
} 

を次のように約束を使用して、あなたのtyped_text機能がそれを使用して、書き換えることができ

+0

ありがとうございます。残念ながらあなたのソリューションでは、divへの入力方法でテキストを出力する再帰呼び出しを失います。私は、ユーザーが最初に文字で文字をタイプするのを見たいと思って、次に2番目のラインは25ずつ同じタイムアウト間隔を使って文字をタイプします。私は現在、作業。 – Chris

関連する問題