2017-06-05 255 views
1

我正在使用試圖在具有三種不同文本行的div中鍵入文本。所以我想爲第一行調用函數typed_text(),然後再次調用第二行,然後再調用第三行。我嘗試使用promises,但是在使用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' - 沒有按看起來不像它 –

+0

我沒有發佈我的代碼使用承諾,因爲我不知道我在哪裏與遞歸。如果不是遞歸,我認爲解決方案會起作用。如果這能幫上忙,我可以分享我所擁有的。 – Chris

回答

0

,你typed_text功能如下

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("#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('進入')作爲函數的第一行,它似乎永遠不會被調用。 – 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; 
} 

難道這是你合適嗎?使用承諾

+0

感謝您的意見。不幸的是,對於你的解決方案,我失去了遞歸調用以打字方式輸出文本到div。我希望用戶能夠看到第一次按字符輸入的字符,然後第二行將逐個字符地輸入,全部使用相同的超時間隔25.我目前正在嘗試類似的東西,但是看看我能否做到這一點工作。 – Chris