JavaScript:恢复为同步的异步函数

JavaScript: asynchronous function that resumes to synchronous

本文关键字:异步 函数 同步 恢复 JavaScript      更新时间:2023-09-26

我有一个非常同步的大型脚本。

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