2015-08-27 25 views
3

我正在構建一個使用異步資源的庫。我希望這個庫能夠在AMD/require下載入。2015年要求/ AMD和異步資源

我見過2011年的this discussion關於承諾支持,但它沒有去。 我見過插件,如asyncrequire-promise - 但我不知道我對安裝插件的庫感覺如何。

我很想知道在加載資源和/或依賴腳本方面是否有任何改變。如果承諾不受支持,是否有另一種方式表明腳本以異步方式準備好了嗎?

+0

[異步](https://github.com/millermedeiros/requirejs-插件#插件)requirejs插件 – Vishwanath

+0

@Vishwanath - 我在我的問題中提到過,有沒有辦法做到沒有插件? – Madd0g

回答

0

我潛入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); 
}); 
+0

作爲一個庫,我甚至不能考慮替換require-js,我希望我的庫能夠使用它。 – Madd0g