在继续循环之前获得回调以完成? [英] getting a callback to finish before continuing a loop?
问题描述
所以我一直在这一段时间。如果有人可以帮助我,我会真的很感激它!我想要的是让我的函数及其回调完成,然后在循环中继续。在用户在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屋!