Asynchronous 2015年需要/AMD和异步资源

Asynchronous 2015年需要/AMD和异步资源,asynchronous,requirejs,amd,Asynchronous,Requirejs,Amd,我正在构建一个使用异步资源的库。我希望该库可以使用AMD/require加载 从2011年开始,我就看到了承诺支持,但它毫无进展。 我见过像和这样的插件,但我不知道我对库安装插件的感觉如何 我想知道在加载资源和/或依赖脚本方面是否有任何变化。如果不支持承诺,是否有其他方法向requirejs发出信号,表明脚本已以异步方式准备就绪?我深入研究了require.js的源代码,但没有找到一种方法来进行异步定义。插件有这个功能,但是简单的定义没有。我认为这背后的原因是异步循环依赖关系有点棘手 但是,编写

我正在构建一个使用异步资源的库。我希望该库可以使用AMD/require加载

从2011年开始,我就看到了承诺支持,但它毫无进展。 我见过像和这样的插件,但我不知道我对库安装插件的感觉如何


我想知道在加载资源和/或依赖脚本方面是否有任何变化。如果不支持承诺,是否有其他方法向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,我希望我的库能够使用它。