Javascript,异步并返回到完全相同的位置
我的输入是可以预处理的javascript代码Javascript,异步并返回到完全相同的位置,javascript,node.js,interpreter,Javascript,Node.js,Interpreter,我的输入是可以预处理的javascript代码 在某个函数中间的某个特定点,有一个令牌,我需要用一些异步请求替换它。异步AJAX请求 在运行时:当异步请求返回并执行回调时,我需要返回到执行异步调用之前代码中具有相同上下文的完全相同的位置 有可能吗?有什么想法吗 请注意,1我可以按照自己的意愿预处理和更改代码。。 2令牌实际上可以在任何地方、循环中或任何其他地方。。3标记只表示异步调用的位置,我可以解析整个文档 此代码可以在浏览器上运行,也可以通过node.js运行 示例代码: function
在某个函数中间的某个特定点,有一个令牌,我需要用一些异步请求替换它。异步AJAX请求
在运行时:当异步请求返回并执行回调时,我需要返回到执行异步调用之前代码中具有相同上下文的完全相同的位置 有可能吗?有什么想法吗 请注意,1我可以按照自己的意愿预处理和更改代码。。 2令牌实际上可以在任何地方、循环中或任何其他地方。。3标记只表示异步调用的位置,我可以解析整个文档 此代码可以在浏览器上运行,也可以通过node.js运行 示例代码:function input(num){
num +=10;
<token>
return num;
}
更新:在我读了你的答案后,这里还有一个问题,
最好的方法是将代码分成两部分。我们将调用整件事函数f,包括异步调用在内的所有事情都是F1,而一旦实现异步结果,需要发生的所有事情都是F2 您需要做的是执行F1,它的最后一个命令是进行异步调用。F1现在已完成,并应将处理返回到main 然而,来自异步调用的回调应该1将传入数据处理到一个结构中或任何你想到的东西中,然后2调用F2提供这个新数据 这是异步的诅咒/美妙之处——在等待应答时,您无法保留同步代码,因此您必须更改结构,以便在收到异步应答后调用依赖的代码段 根据您的示例更新: 由于异步,您也必须改变对返回数据和消费的思考方式。假设您的呼叫代码是:
var b=input(2);
在中间不会有一个异步呼叫。相反,您需要的是:
var b;
getInput(2);
function getInput(num) {
num+=10;
async-request(...,/*callback=*/supplyNum);
}
function supplyNum(reply) {
b=reply;
}
这是一个例子-我完全不建议使用全局变量,但你希望得到这个想法。我跳过了如何处理getInput中的num—假设您正在等待异步请求,它可能会接收num作为参数,因此它的答案将是相关的修改。很可能你只是举了个例子,但我想我应该提一下 有几个项目试图使用continuations将以同步模式编写的代码重写为异步代码。例如,您可能想看看: 一些模式循环、尝试/捕获可能比简单的线性流带来更多的挑战,但我很确定在一般情况下这是一个可解决的问题。不过,我不认为您可以通过简单的令牌替换来实现这一点——您需要解析javascript并对其进行转换 Javascript,异步并返回到完全相同的位置 这称为同步代码,与异步代码相反
实际上,您需要的是一个阻塞调用。这完全没有经过测试,但您可以尝试以下方法:
function sleep(delay)
{
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
function waitforAsync(url, callback) {
var done = false;
var req = new XMLHttpRequest();
req.open("GET", url, true)
req.onreadystatechange = function() {
if (req.readyState != 4) { return; }
callback(req.responseText);
done = true;
};
req.send(null);
while (not done) {
sleep(1000);
}
}
function input(num){
num +=10;
waitforAsync(url, callback);
return num;
}
这里需要一些示例\\代码来提供更好的帮助。streamlinejs:您能解释一下uu是如何工作的吗?它真的是异步的吗?在我们等待回调时是否运行其他代码?取得了类似的成就。这都是黑魔法;避免这种情况。@ciochPep任何类似的转换都需要了解它所使用的函数-无论是同步的还是异步的,如果是异步的,哪个函数是回调函数,除非您假定约定,否则回调的签名是什么。我对streamline不太熟悉,但我认为u是回调所在位置的标记。虽然您的sleep函数可以工作,但它也会导致100%的处理器使用率和阻塞-阻止其他JS代码执行或严重降低性能。反正是在浏览器中。@Rudu:我想是这样,但问题是:进行异步调用……但暂停当前执行,直到它返回。。。这似乎是最简单的方法,但我也同意,从一般意义上说,我当然不会推荐它。耶,谢谢你,没有给出任何理由。这个开发人员实际上是在问如何同步地做事情,但称之为异步。
function sleep(delay)
{
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
function waitforAsync(url, callback) {
var done = false;
var req = new XMLHttpRequest();
req.open("GET", url, true)
req.onreadystatechange = function() {
if (req.readyState != 4) { return; }
callback(req.responseText);
done = true;
};
req.send(null);
while (not done) {
sleep(1000);
}
}
function input(num){
num +=10;
waitforAsync(url, callback);
return num;
}