JavaScript:异步函数,恢复到同步
问题描述:
我有一个非常同步的大脚本。JavaScript:异步函数,恢复到同步
1)运行这样的功能:
var result = doSomethingSynchronous(myVar);
if (result === 'something') {
doSomethingElse();
}
的doSomethingSynchronous函数有一个for循环,一个if语句返回值:
var i = 0; len = someVariable.length;
for (; i < len; i++) {
if (someVariable[i] === 'aString') {
return true;
} else {
doSomethingElse();
}
}
因为for循环和处理可以激烈,我已经用一个迭代队列处理函数替换了for循环,该函数在从数组中移出一个元素后使用setTimeout异步运行。一旦它异步运行,它当然不会返回该值并将其分配给第一个片段中的'result'变量,并且if语句总是失败。我的问题是,有没有办法让这部分保持同步?在脚本进入下一行之前是否将值分配给结果?或者我是否必须使用观察者/中介模式或类似的方式来通知异步功能已完成?
或者我可以使用回调,但实际的实际代码比这个更长,都取决于同步性。因此,将var result = doSomethingSynchronous()切换为异步会对其余的同步脚本产生多米诺骨牌效应,对吗? :-) 这听起来像一个困难和容易出错的转换,所以我想我会征求建议。
谢谢!
- UDPATED修复变量名“le”。它应该是“len”
答
为了将结果赋值给一个值,你需要通过回调和调用,而不是返回一个值,不管你是否推迟了定时器的功能。
function doSomething(someVariable, callback){
var i = 0; len = someVariable.length;
for (; i < len; i++) {
if (someVariable[i] === 'aString') {
callback && callback(true);
break;
} else {
setTimeout(function(){ deferredSomething(callback); }, 10);
}
}
}
function deferredSomething(callback){
/* code.. */
callback && callback('something');
}
doSomething(myVar, function(result){
if (result === 'something') {
doSomethingElse();
}
});
我还要提到的是,如果你正在做的事情紧张,你一定要看看网络工作者,所以你可以卸载到后台线程,特别是如果你只是一个FireFox的工作插件。https://developer.mozilla.org/En/Using_web_workers
--UPDATED要修复的示例代码(固定变量 “了”,应为 “LEN”)