Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在继续循环之前完成回调?_Javascript_Loops_Callback_Google Api_Google Translate - Fatal编程技术网

Javascript 在继续循环之前完成回调?

Javascript 在继续循环之前完成回调?,javascript,loops,callback,google-api,google-translate,Javascript,Loops,Callback,Google Api,Google Translate,所以我已经在这上面呆了一段时间了。如果有人能帮我解决这个问题,我会非常感激!我想要的是在循环中继续之前完成函数及其回调。在用户在文本区域中输入英文文本并单击翻译按钮后,我称之为“translate_all”。(“Method”、“g_loop”、“g_where”和“go”是全局变量。)最终我想要的是将输入的英语短语翻译成数组中的下一种语言,然后将其翻译回英语,看看是否有差异,然后继续遍历所有语言 我试过许下诺言,但老实说,我无法相信。我尝试了这种“黑客式”的方法,在while循环中捕获循环,直

所以我已经在这上面呆了一段时间了。如果有人能帮我解决这个问题,我会非常感激!我想要的是在循环中继续之前完成函数及其回调。在用户在文本区域中输入英文文本并单击翻译按钮后,我称之为“translate_all”。(“Method”、“g_loop”、“g_where”和“go”是全局变量。)最终我想要的是将输入的英语短语翻译成数组中的下一种语言,然后将其翻译回英语,看看是否有差异,然后继续遍历所有语言

我试过许下诺言,但老实说,我无法相信。我尝试了这种“黑客式”的方法,在while循环中捕获循环,直到在回调后更改全局变量“go”。但是,当我运行这个程序时,浏览器会冻结,我认为这是因为尽管这种方法阻止了循环继续,但它被困在循环中,以至于它从未收到来自回调的消息,即“go”已更改。也许我可以像很快推荐给我的那样做一些事件监听器,但我不确定。我觉得我离得太近了,想让它发挥作用这么长时间,我都快疯了。感谢您的任何帮助!谢谢

我有这个:

var translate_all = function translate_all () {
  // set global g_where to this div to append an image
  g_where = $("#g_div");
  g_where.append("<img alt='Google Logo' src='/img/google_g_medium.png'/><br>");
  // get the text the user input
  var a_text = $("#accuracy_text").val();  
  // translation codes for api
  var language_codes = ["en", "ar", "bg", "ca", "hr", "cs", "da", "nl", "et", "fi", "fr", "de", "el", "ht", "id", "it", "ko", "lv", "lt", "ms", "mt", "no", "fa", "pl", "pt", "ro", "ru", "sl", "sl", "es", "th", "tr", "uk", "ur", "vi"]; 
  // set global g_loop to what text the user input
  g_loop = a_text;
  // start a loop
  for (var i = 1; i < language_codes.length; i++)
  {
    // error checking and trying to debug and see what is wrong
    console.log("working")
    // define which callback i want to run
    method = 2;
    // this callback sets the response from google placed in g_response to g_loop; it translates from one language in loop to the next
    GoogleTranslate(g_loop, language_codes[i-1], language_codes[i]);
    console.log("continue");
    // THIS is where i try to get the loop to stop until the callback has run because this loop is only able to break when the callback has finished
    while (go == 0)
    {
      if (go == 1)
      {
        break;
      }
    }
    // set go back to zero
    go = 0;
    // set g_where and append the response to the div
    g_where = $("#g_div");
    g_where.append(g_response)
    method = 1;
    // this translates the initial response back to english to see if there is a difference and appends it to the div
    GoogleTranslate(g_loop, language_codes[i], "en");
    // trying to make sure the callback is executed again before continuing
    while (go == 0)
    {
      if (go == 1)
      {
        break;
      }
    }
    go = 0;
  }
}


function GoogleTranslate (text, from, to) {

  var newScript = document.createElement('script');
  var sourceText = escape(text);
  newScript.type = 'text/javascript';
  var APIKEY = 'my api key';
  var source = 'https://www.googleapis.com/language/translate/v2?';
  source += 'key=' + APIKEY;
  source += '&source=' + from;
  source += '&target=' + to;
  source += '&callback=google_translation';
  source += '&q=' + sourceText;
  newScript.src = source;
  console.log("sent");

  // send the reuqest to google api
  $('head')[0].appendChild(newScript); 
}


// callback
function google_translation(response) {
  g_response = response.data.translations[0].translatedText;
  if (method == 0)
  {
    // replaces text in a given location (not for code shown)
    g_where.val(g_response);
    console.log("0");
  }
  if (method == 1)
  {
    // appends text in a given location
    g_where.append(": " + g_response + "<br>");
    console.log("1");
  }
  if (method == 2)
  {
    // sets variable to response
    g_loop = g_response;
    console.log("2");
  }
  go = 1;
  console.log("translated");      
}
var translate\u all=函数translate\u all(){
//将全局g_设置为此div的何处以附加图像
g#u where=$(“#g#u div”);
g_其中。追加(“
”); //获取用户输入的文本 var a_text=$(“#精度_text”).val(); //api的翻译代码 var语言代码=[“en”、“ar”、“bg”、“ca”、“hr”、“cs”、“da”、“nl”、“et”、“fi”、“fr”、“de”、“el”、“ht”、“id”、“it”、“ko”、“lv”、“lt”、“ms”、“mt”、“no”、“fa”、“pl”、“pt”、“ro”、“ru”、“sl”、“sl”、“es”、“th”、“tr”、“uk”、“ur”、“vi”]; //将全局g_循环设置为用户输入的文本 g_循环=a_文本; //开始循环 对于(变量i=1;i”); 控制台日志(“1”); } if(方法==2) { //将变量设置为响应 g_环=g_响应; 控制台日志(“2”); } go=1; 控制台日志(“翻译”); }
您可以创建一系列承诺,这些承诺将按如下顺序运行:

myList.reduce((promise, item) => {
  return promise.then(() => new Promise((resolve, reject) => {
    // do whatever you need to do here
    // resolve when finished with this iteration.
  }))
}, Promise.resolve());
因此,假设您有一个类似于
[1,2,3]
的列表,并且您给出了回调承诺。 使用此方法或多或少会转化为:

Promise.resolve()
  .then(1 => function () { })
  .then(2 => function () { })
  .then(3 => function () { });

你好谢谢你的回复,但我还是不确定它到底是什么意思;我对承诺感到很不舒服。你介意再详细说明一下吗?(myList将在哪里定义?item定义在哪里?我是否在新承诺中解析?)抱歉,如果这些问题看起来很简单。基本上,承诺只是编写回调的另一种方式。这将创建一个按顺序执行的回调链