等待使用settimeout的函数在javascript中完成,然后再重新运行它

等待使用settimeout的函数在javascript中完成,然后再重新运行它,javascript,jquery,Javascript,Jquery,请帮忙 我需要等待一个操作完成,然后在javascript中再次执行它。这些操作可能在不同的时间运行。不是一下子。我一次运行两个操作有问题,因为它们同时执行 输出应使用settimeout在“文本区域”中追加文本。它需要等待该操作完成,然后在调用“arrayofrandomtext”数组的任意随机索引处开始键入下一个文本。稍后,“ProcessText(someint)”仍然可以根据击键等调用 必须追加现有文本,而不是在0处替换为追加文本 i、 你好,世界。还有别的 var指数=0; va

请帮忙

我需要等待一个操作完成,然后在javascript中再次执行它。这些操作可能在不同的时间运行。不是一下子。我一次运行两个操作有问题,因为它们同时执行

输出应使用
settimeout
在“文本区域”中追加文本。它需要等待该操作完成,然后在调用“arrayofrandomtext”数组的任意随机索引处开始键入下一个文本。稍后,“ProcessText(someint)”仍然可以根据击键等调用

  • 必须追加现有文本,而不是在0处替换为追加文本 i、 你好,世界。还有别的
var指数=0;
var arrayofrandomtext=[“你好,世界”,“其他东西”,“其他东西”];
函数ProcessText(someint){
//这些可能会一起运行
下一个字母(arrayofrandomtext[someint]);
//等待完成并与其他文本一起重新运行
下一个字母(arrayofrandomtext[someint]);
//稍后,如果用户点击某个键,则此操作可能只会运行
下一个字母(arrayofrandomtext[someint]);
}
函数下一个字母(文本){

如果(index尝试创建文本值数组,请使用
array.prototype.slice()
创建文本值初始数组的副本;
array.prototype.shift()
下一个字母
设置文本参数;如果数组在初始调用
下一个字母
后具有
长度
,则递归调用
ProcessText

var arr=[“你好…”,“其他一些文本”],
复制=阵列切片(),
按钮=document.querySelector(“输入”)
someControl=document.querySelector(“textarea”),
指数=0;
函数ProcessText(){
下一个字母(copy.shift())
}
函数下一个字母(文本){

如果(index首先,您已经这样做了,但是我想要一个工作版本进行演示。您可以编写一个递归函数,在完成后调用settimeout。例如,给定一个函数,该函数注销字符串的每个字母

var log = function(text, index, duration) {
  console.log(text[index]);

  if (index < text.length - 1) {
    setTimeout(function() {
      log(text, index + 1, duration);
    }, duration);
  }
};

log("Hello There", 0, 1000);
log("Nice to see You", 0, 1000);
虽然这样做有效,但对于多个嵌套来说可能会变得不方便。一个更好的解决方案是使用承诺-您只需要将您的logCB包装到另一个函数中。这里f是一个logCB

var promiseLog = function(f, text, delay) {
  return new Promise(function(resolve, reject) {
     f(text, 0, delay, resolve);
  });
};
然后…我们可以把它们连在一起等待…然后

promiseLog(logCB, "Hello World", 1000)
 .then(function() {
   return promiseLog(logCB, "Hey There", 1000)
 });

这是什么
someControl.value
var promiseLog = function(f, text, delay) {
  return new Promise(function(resolve, reject) {
     f(text, 0, delay, resolve);
  });
};
promiseLog(logCB, "Hello World", 1000)
 .then(function() {
   return promiseLog(logCB, "Hey There", 1000)
 });