JavaScript:恢复为同步的异步函数
JavaScript: asynchronous function that resumes to synchronous
我有一个非常同步的大型脚本。
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语句总是失败。我的问题是,有没有办法保持这部分的同步?在脚本进入下一行之前,是否已将值分配给result?或者,我是否需要使用观察者/中介器模式或类似模式来通知异步功能已完成?
或者,我可以使用回调,但实际的实际代码比这个长,并且都取决于同步性。因此,将var result=doSomethingSynchronouss()切换为异步会对其他同步脚本产生多米诺骨牌效应,对吗?:-)这听起来像是一个困难且容易出错的转换,所以我想我应该征求一下建议。
谢谢!
--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
--更新以修复示例代码(固定变量"le",应为"len")
相关文章:
- 如何在异步函数中使用javascript对象
- Meteor:异步函数回调异常:onAfterAction
- 未调用jquery异步函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何在异步函数中正确使用Promise.all()和then()
- 从异步函数返回值
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 如何在将Node异步函数转换为promise时使用Q库
- 如何在异步函数与Deferredjquery之间同步
- ng用异步函数模拟怪异行为
- 用mocha测试异步函数
- 用于异步函数中的循环和定时问题
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 嵌套异步函数未及时返回数据的问题
- 在异步函数中维护变量的状态
- 递归异步函数
- Bluebird promisifyAll不会创建整个异步函数集
- 递归调用异步函数
- 异步函数调用是否可以在两个同步语句之间完成
- 如何在nodejs中实现异步函数