如何在JavaScript中管理复杂的异步处理?
我正在启动一个web应用程序,它有多个过程,这需要一些时间。 为了减少加载时间,我希望实现如下异步处理:如何在JavaScript中管理复杂的异步处理?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我正在启动一个web应用程序,它有多个过程,这需要一些时间。 为了减少加载时间,我希望实现如下异步处理: loadXML()----- \ loadCanvas()---setupCanvas() \ setupYoutubePlayer()---------startApplication() 也就是说,当加载页面时,我想启动loadXML(),loadCanvas()和 setupyoutubeplyer(
loadXML()-----
\
loadCanvas()---setupCanvas()
\
setupYoutubePlayer()---------startApplication()
也就是说,当加载页面时,我想启动loadXML()
,loadCanvas()
和
setupyoutubeplyer()
同时启动,并在loadXML()时启动setupCanvas()
,然后
loadCanvas()
完成,并在setupCanvas()之后启动setupApplication()
,以及
setupyoutubeplyer()
完成
loadXML()
和setupCanvas()
包含AJAX处理,而setupYoutubePlayer()
包含API访问,并且是API指定的回调函数(onyoutubeiframeapiredy()
)所必需的
经过几天的谷歌搜索,我发现
和
. 说到Deffered,我可以把所有的
通过Deferred.promise()
和Deferred.resolve()
进行处理,但我没有找到简单的解决方案
要实现此嵌套异步处理,请使用when()
和then()
。
至于Async.js,我不知道如何处理setupyoutubeplyer()
我错过了什么?或者在这种情况下还有其他知识吗?
请帮忙。谢谢。帮个忙,使用真正的promise实现,忘记jQuery中的roflmaolol实现
看一看(更具体地说),他们有各种用例的代码示例和几个不同的promise库的列表。一些libs是最小的,而其他libs提供了对promise规范的扩展
如果我理解您的流程正确,这可能会做到:
var a = loadXML();
var b = loadCanvas();
Promise.all([a, b]).then( function() {
var c = setupCanvas();
var d = setupYoutubePlayer();
return Promise.all([c, d]);
} ).done( startApplication );
或者如果可以在与loadXML
和loadCanvas
函数相同的步骤中调用setupYoutubePlayer
:
var a = loadXML();
var b = loadCanvas();
var c = setupYoutubePlayer();
Promise.all([a, b]).then( function() {
var d = setupCanvas();
return Promise.all([c, d]);
} ).done( startApplication );
也许可以进一步优化上述代码,但我将其作为练习留给读者;) 帮个忙,使用真正的promise实现,忘记jQuery中的roflmaolol实现
看一看(更具体地说),他们有各种用例的代码示例和几个不同的promise库的列表。一些libs是最小的,而其他libs提供了对promise规范的扩展
如果我理解您的流程正确,这可能会做到:
var a = loadXML();
var b = loadCanvas();
Promise.all([a, b]).then( function() {
var c = setupCanvas();
var d = setupYoutubePlayer();
return Promise.all([c, d]);
} ).done( startApplication );
或者如果可以在与loadXML
和loadCanvas
函数相同的步骤中调用setupYoutubePlayer
:
var a = loadXML();
var b = loadCanvas();
var c = setupYoutubePlayer();
Promise.all([a, b]).then( function() {
var d = setupCanvas();
return Promise.all([c, d]);
} ).done( startApplication );
也许可以进一步优化上述代码,但我将其作为练习留给读者;) 您还可以使用Iced CoffeeScript,它提供等待和延迟关键字以同步方式处理异步回调。您还可以使用Iced CoffeeScript,它提供等待和延迟关键字以同步方式处理异步回调。这非常简单,甚至只需要jQuery承诺(假设1.8+)您可以执行以下操作:
var xml = loadXML();
var canvas = loadCanvas();
var youtubePlayer = setupYoutubePlayer();
$.when(
$.when(xml, canvas).then(setupCanvas),
youtubePlayer
).then(startApplication);
这非常简单,即使只是jQuery承诺(假设为1.8+),您也可以做到:
var xml = loadXML();
var canvas = loadCanvas();
var youtubePlayer = setupYoutubePlayer();
$.when(
$.when(xml, canvas).then(setupCanvas),
youtubePlayer
).then(startApplication);
简单且最好。这是我的建议,但o已经回答得很好。Kudos简单且最好。这是我的建议,但o已经回答得很好。谢谢