Asynchronous 2015年需要/AMD和异步资源
我正在构建一个使用异步资源的库。我希望该库可以使用AMD/require加载 从2011年开始,我就看到了承诺支持,但它毫无进展。 我见过像和这样的插件,但我不知道我对库安装插件的感觉如何Asynchronous 2015年需要/AMD和异步资源,asynchronous,requirejs,amd,Asynchronous,Requirejs,Amd,我正在构建一个使用异步资源的库。我希望该库可以使用AMD/require加载 从2011年开始,我就看到了承诺支持,但它毫无进展。 我见过像和这样的插件,但我不知道我对库安装插件的感觉如何 我想知道在加载资源和/或依赖脚本方面是否有任何变化。如果不支持承诺,是否有其他方法向requirejs发出信号,表明脚本已以异步方式准备就绪?我深入研究了require.js的源代码,但没有找到一种方法来进行异步定义。插件有这个功能,但是简单的定义没有。我认为这背后的原因是异步循环依赖关系有点棘手 但是,编写
我想知道在加载资源和/或依赖脚本方面是否有任何变化。如果不支持承诺,是否有其他方法向requirejs发出信号,表明脚本已以异步方式准备就绪?我深入研究了require.js的源代码,但没有找到一种方法来进行异步定义。插件有这个功能,但是简单的定义没有。我认为这背后的原因是异步循环依赖关系有点棘手 但是,编写一个小型异步函数库并非不可能:
(function(context) {
const modules = new Map();
function require(name) {
return Promise.resolve(null).then(function() {
const module = modules.get(name);
if (!module) throw new Error("Undefined module");
if (module.promise) {
return module.exports;
} else {
return module.promise = Promise.all(
module.deps.map(internalRequire)
).then(function(args) {
return module.factory.apply(context, args);
}).then(function(defExport) {
if (defExport !== undefined) {
module.exports.default = defExport;
}
return module.exports;
});
}
function internalRequire(name) {
return (name === 'exports') ? module.exports : require(name);
}
});
}
function define(name, deps, factory) {
if (modules.has(name)) throw new Error("Redefined module");
modules.set(name, {
name: name,
deps: deps,
factory: factory,
exports: {},
promise: null
});
}
context.require = require;
context.define = define;
})(self);
用法:
define('A', ['B'], function(dep) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("A(" + dep.default + ")");
}, 100);
});
});
define('B', ['C'], function(dep) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("B(" + dep.default + ")");
}, 100);
});
});
define('C', ['A'], function(dep) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve("C(" + dep.default + ")");
}, 100);
});
});
require("A").then(function(s) {
console.log(s);
});
安魂曲plugin@Vishwanath我在我的问题中提到过,有没有一种方法可以不用插件呢?作为一个库,我甚至不能考虑替换JS,我希望我的库能够使用它。