【问题标题】:Asynchronous programming in javascriptjavascript中的异步编程
【发布时间】:2015-05-18 03:44:45
【问题描述】:

我有一个load() 函数,在里面我想调用一个函数说download(),它会下载一个xml 文件。下载完成后,我必须调用一个函数 parseXML() 来解析下载的 xml 文件。解析完成后,我必须调用另一个函数,比如processParsedXMLFile()。您能否指导我如何以最简单的方式实现这一目标?

【问题讨论】:

  • download().then(parseXML).then(processParsedXMLFile).
  • 要包含任何库?
  • 可能不取决于您的环境。
  • 你认为最简单的是什么?

标签: javascript asynchronous


【解决方案1】:

你可以使用回调

load(params , function(){
  download(params, function(){
      parseXML(params, function(){
        processParsedXMLFile(params, function(){
           ...
        })
      })
   })
})

【讨论】:

  • 我还要补充一点,回调通常接受结果的一个参数,或者有时接受两个参数(错误和结果),或者有时有两个回调(一个用于错误,一个用于成功)。底线 - 阅读异步函数的文档并注意回调的签名。
  • 另外,请注意通常 IO 方法是异步的(例如下载资源,或等待用户事件),但“处理”和“解析”方法通常是同步的。再次 - 阅读您正在使用的函数的文档。
  • 很好的答案。哦等等,现在是 2015 年。
  • 我认为向一个明显不了解异步 JavaScript 的人解释 promise 并不容易。
  • @Maroun 我认为承诺比回调更容易解释。
【解决方案2】:

JavaScript 中的异步代码存在两种常见的方法 - 回调和承诺。

在 SO 上有很多帖子讨论回调,Javascript callback after json parse 展示了很好的示例和详细的解释。

对于 Promise:http://wiki.commonjs.org/wiki/Promises/Ahttps://www.promisejs.org/ 是了解 Promise 的良好起点,现在在 JavaScript 中编写异步代码更为常见。

根据您运行脚本的位置,您可能需要包含包/库以支持 Promise:

使用 Promise 如下所示(假设每个调用都返回操作完成时实现的 Promise):

download()
   .then(function(data){/* parse XML here */})
   .then(function(data){/* process parsed XML*/ });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多