【问题标题】:Can I make an asynchronous javascript method behave synchronously with async-waterfall?我可以使异步 javascript 方法与 async-waterfall 同步吗?
【发布时间】:2016-06-09 20:08:09
【问题描述】:

我的 JavaScript 应用程序中有三个函数调用,第二个是异步的,所以看起来像这样。

function runner() {
    function1();
    function2(); //This is the one that is asynchronous
    function3();
}

这会导致 function3 在 function2 之前完成的问题,从而导致我的应用程序出现问题。到目前为止,我的应用程序是纯 javascript,但我正在寻找一种可靠的方法来确保我的函数按顺序运行,而不必进入回调地狱。我以为我可以async-waterfall,但我没有在我的应用程序上运行节点,我只是在浏览器中。任何想法表示赞赏。

【问题讨论】:

  • 如果你的function2既不接受回调也不返回promise对象,那么你无能为力。
  • 好吧,严格来说这不是真的。他可以通过无限循环锁定浏览器等待function2 的一些副作用。但我也建议承诺。
  • 不,他不能。因为这种副作用必须由无法运行的并行进程触发,因为 js 是单线程的。无限循环只会杀死页面。
  • 标题中提到的“async-waterfall”是什么?我在问题中没有看到任何提及。
  • @NickP 您运行的环境是什么?浏览器还是 Node.js?

标签: javascript asynchronous


【解决方案1】:

如果您绝对不能修改您的函数以利用承诺或接受回调,一种解决方案是使用interval 来检查function2 是否已完成。绝对不是最好的方法,但这样的方法会奏效。

我认为这比回调地狱更糟糕。

var waitFor = function(test, success) {
  var iv = setInterval(function() { 
  if (test()) { 
    clearInterval(iv); 
    success();
  }, 500);
}

var isFunction2Done = function() {
  //some logic here, true if done, false otherwise
}

function1();
function2();
waitFor(isFunction2Done, function3);

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2013-05-14
    • 2017-09-07
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多