在继续循环之前获得回调以完成? [英] getting a callback to finish before continuing a loop?

查看:157
本文介绍了在继续循环之前获得回调以完成?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我一直在这一段时间。如果有人可以帮助我,我会真的很感激它!我想要的是让我的函数及其回调完成,然后在循环中继续。在用户在textarea中输入英语文本并点击翻译按钮后,我调用translate_all。 (Method,g_loop,g_where和go是全局变量。)最终我想要的是输入英语短语翻译成数组中的下一个语言,然后翻译成英语如果有区别,然后继续穿越所有的语言。

so I have been stuck on this for a while. If someone could help me out with this i would really appreciate it! What i want is to have my function and its callback finish before continuing on in a loop. I call "translate_all" after a user has input a text in english in a textarea and has clicked the translate button. ("Method", "g_loop", "g_where" and "go" are global variables.) Ultimately what i want is to have the input english phrase translate to the next language in the array, then have that translated back to english to see if there is a difference, and then continue on through all the languages.

我试过承诺,但老实说,我不能绕过我的头。我试着这种hackish方法,在一个while循环中捕获循环,直到全局变量go在回调之后改变。但是,发生什么是浏览器冻结时,我运行这个,我认为这是因为虽然该方法停止循环继续,它是如此停滞在循环中,它从来没有收到来自回调的消息go 。也许我可以做某种事件监听器,因为很快被推荐给我,但我不知道。我觉得我这么近,它正在驱使我疯了想让这个工作了这么久。任何和所有的帮助是赞赏!非常感谢!

I tried promises but honestly i couldnt wrap my head around it. I tried this "hackish" approach with trapping the loop in a while loop until the global variable "go" is changed following the callback. But, what happens is that the browser freezes when i run this and i think it is because although the approach stops the loop from continuing, it is so stuck in the loop that it never receives the message from the callback that "go" was changed. Perhaps I could do some sort of event listener as was quickly recommended to me, but im not sure. I feel that i am so close, and it is driving me mad trying to get this to work for so long. Any and all help is appreciated! Thanks!

我有这个:

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");      
}


推荐答案

promise将按如下顺序运行:

You can create a chain of promises that will run in sequence like this:

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] / code>并且你给了回调promise。
使用此方法或多或少转换为:

So imagine you had a list like [1,2,3] and you gave the callback promise. Using this method more or less translates to this:

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

这篇关于在继续循环之前获得回调以完成?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆