gpt4 book ai didi

javascript - 将异步调用转换为同步?

转载 作者:行者123 更新时间:2023-11-28 20:50:56 25 4
gpt4 key购买 nike

我在处理异步调用时遇到问题。

例如,我想使用 requirejs 动态加载一些模块。目前我使用订阅者-发布者模式。不幸的是,这使得我的代码在某些情况下确实令人困惑......:

想象对象中有一个工作事件系统

var loader = {
load: function(modules) {
// do a async requirejs call
require(modules, function(){
// map arguments to normal array
var modules = [].slice().call(arguments);
// fire loaded event, pass modules
this.trigger('loaded', modules);
}.bind(this));
}
};


var parent = {
// do some initialization work
initialize: function() {
// execute the second initialization when our modules have finished loading async
loader.on('loaded', this.secondInitialize, this);
// require the given modules in the array
loader.load(['one', 'two', 'three']);
},

secondInitialize: function(modules) {
var three = new modules[2]();
// do something with the 'three' module
}

};

如您所见,这确实令人困惑。

还有其他设计模式可以很好地处理异步调用吗?

最佳答案

查看jQuery Deferred object 。 (即使没有 jq,大多数库都有 JavaScript Promise 的实现)

有了它,你可以做这样的事情:

var loadingOne = getLibOne(); //returns a jquery deferred promise
var loadingTwo = getLibTwo(); //returns another one

var loadingAllLibraries = $.when(loadingOne, loadingTwo);
loadingAllLibraries.done(function(lib1, lib2) {
//... stuff
});

不完全是你的场景,但你明白了。组成异步原子变得相对容易。

关于javascript - 将异步调用转换为同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12447587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com