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”)