编程语言
首页 > 编程语言> > Javascript将异步转换为同步

Javascript将异步转换为同步

作者:互联网

我是网络开发的新手.来自Delphi / pascal.我的长期目标是将遗留应用程序转换为Web环境. (我正在使用这个应用程序:http://smartmobilestudio.com/交叉编译pascal到javascript,但这不应该影响这个问题).我的遗留程序使用同步远程过程调用(RPC)到服务器.我使用名为EWD.js(http://robtweed.wordpress.com/2014/01/23/ewd-js-on-fhir/comment-page-1/)的技术,通过node.js进行异步调用.我在这里读了很多关于同步和同步调用的帖子.如果我不能让EWD以同步的方式行事,我担心我只是运气不好.但我想更好地理解这一点.

考虑这个伪代码:

RPCcall
//business logic
RPCCall
//business logic
RPCCall
//business logic.

如果任何RPC调用失败,则整个应用程序应该失败.我已经阅读了“延续样式”中的编码,我认为每个异步调用都会通过让onMessage处理程序在收到返回消息时调用回调函数来告知在完成时获取补丁的位置:

MyProc()
  RPCCall(<name>,MyProc_2);
end;

MyProc2()
  //business logic
  RPCCall(<name, MyProc_3);
end;

MyProc3()
  //business logic
  RPCCall(<name, MyProc_3);
end.

虽然尴尬/丑陋,但这是可能的.但是这样的情况怎么样?

RPCcall
//business logic
if conditionA then begin
  if conditionA2 then begin
    RPCCall
    //business logic
  end else
    RPCCall
    //business logic
  end else begin
    for i=1 to 10 do begin
      RPCCall
      //business logic
    end;
  end
end

我没有真实地看到如何将上述转换为延续风格.如果在逻辑树或循环中间有一个调用,我怎么能跳回到那个状态?以前怎么做过的?完全重新编码遗留应用程序是不现实的.它非常大而且复杂.

任何帮助将不胜感激.
谢谢

解决方法:

你可能想要使用AJAX和jQuery.有一个参数可以确保它发送同步调用而不是正常的异步调用.

它看起来像这样:

if(/*condition*/) {

function RPCCall() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}
   //business logic
}

如果你真的不想使用AJAX,并使用nodejs,你可以这样做:

var sequence = Futures.sequence();

sequence
  .then(function(next) {
     http.get({}, next);
  })
  .then(function(next, res) {
     res.on("data", next);
  })
  .then(function(next, d) {
     http.get({}, next);
  })
  .then(function(next, res) {
    ...
  })

如果你需要传递一个范围,你可以做这样的事情.

  .then(function(next, d) {
    http.get({}, function(res) {
      next(res, d);
    });
  })
  .then(function(next, res, d) { })
    ...
  })

我希望这会有所帮助.

标签:javascript,synchronous,legacy
来源: https://codeday.me/bug/20190528/1174308.html