Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中管理复杂的异步处理?_Javascript_Jquery_Ajax_Asynchronous - Fatal编程技术网

如何在JavaScript中管理复杂的异步处理?

如何在JavaScript中管理复杂的异步处理?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我正在启动一个web应用程序,它有多个过程,这需要一些时间。 为了减少加载时间,我希望实现如下异步处理: loadXML()----- \ loadCanvas()---setupCanvas() \ setupYoutubePlayer()---------startApplication() 也就是说,当加载页面时,我想启动loadXML(),loadCanvas()和 setupyoutubeplyer(

我正在启动一个web应用程序,它有多个过程,这需要一些时间。 为了减少加载时间,我希望实现如下异步处理:

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已经回答得很好。谢谢