我正在尝试使用 Harmony Proxies (Node.js) 获取用 JavaScript 编写的动态服务定位器。基本上你会创建一个新容器:
var container = new Container();
Run Code Online (Sandbox Code Playgroud)
然后,您将能够像传统服务定位器一样设置和获取值:
container.set('FM', {});
container.get('FM');
container.get('FM', function(FM) {
});
Run Code Online (Sandbox Code Playgroud)
您甚至可以拥有充当子对象的名称空间:
container.set('FM.Object', {});
Run Code Online (Sandbox Code Playgroud)
问题出在动态别名上。
var App = container.alias('App');
Run Code Online (Sandbox Code Playgroud)
创建别名时,它会创建一个新的代理对象,您可以在其中像传统对象一样操作它,但它是 和get()方法的别名set()。
代替:
container.get('App.Hello');
Run Code Online (Sandbox Code Playgroud)
使用别名,您可以使用:
App.Hello
Run Code Online (Sandbox Code Playgroud)
问题在于深层命名空间。假设您正在尝试访问App.Hello.World.Controller,因为它一次通过代理一个命名空间,而不是一次全部通过(就像完整的命名空间一样)。我如何知道用户是否正在调用App.Hello以检索服务定位器中存储的值,或者用户是否想要继续访问更深的命名空间?你不能(根据我的尝试)。
还有什么其他方法可以实现这一目标?
App.Hello.World如果要访问更深的命名空间,则具有返回代理或存储在服务定位器中的值的语法。
var App = container.alias('App');
App.Controller.Home.Method.Index
// It would go through:
App -> Proxy
App.Controller -> Proxy or Value?
App.Controller.Home -> Proxy or Value?
App.Controller.Home.Method -> Proxy or Value?
App.Controller.Home.Method.Index -> Proxy or Value?
Run Code Online (Sandbox Code Playgroud)
现在,我已经制定了一个处理这两个选项的约定。您可以使用单数名称来检索值,使用复数名称来返回代理。这只是一个快速的“黑客”,因为它不是很有效。 …
javascript service-locator proxies node.js ecmascript-harmony
在节点(0.11.9,带有--harmony标志)中,如何在生成器完成后重新启动它?
我尝试过,generator.send(true);但它说send()方法不存在.
对于ES6生成器,为什么这篇博文的作者说:
来自:http://davidwalsh.name/es6-generators
"第一个下一个(..)调用,我们不发送任何内容.为什么?因为没有收益表达式来接收我们传入的内容."
不是第一次it.next()打电话(yield (x + 1))?
function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var it = foo( 5 );
// note: not sending anything into `next()` here
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // …Run Code Online (Sandbox Code Playgroud) 我有一个使用大型打字稿代码库的网站.所有clases都在他们自己的文件中,并包含一个内部模块,如下所示:
文件BaseClass.ts
module my.module {
export class BaseClass {
}
}
Run Code Online (Sandbox Code Playgroud)
文件ChildClass.ts
module my.module {
export ChildClass extends my.module.BaseClass {
}
}
Run Code Online (Sandbox Code Playgroud)
所有文件都以脚本标记全局包含在适当的顺序中(使用ASP.NET Bundling).
我想转向更现代的设置并使用webpack.我希望我的模块语法能够使用新的ECMASCRIPT模块标准.但是有很多代码使用现有的"模块命名空间",所以我想要一个支持这种类型代码的更新路径 -
let x = new my.module.ChildClass();
Run Code Online (Sandbox Code Playgroud)
所以我想我需要这样的东西 -
import * as my.module from ???;
Run Code Online (Sandbox Code Playgroud)
还是使用命名空间?
但是,如果这不是最佳做法,我想坚持最佳做法.内部模块目前非常有助于组织不同的应用程序层和服务......
由于"模块"跨越了许多文件,我将如何实现这一目标?实际上,我想要完成的只是拥有一个名称空间,并远离全局脚本.
要在ES6中创建地图,您应该说Map()还是new Map()?
两者似乎都运行良好node --harmony.
规范草案说:"Map构造函数是%Map%内在对象和全局对象的Map属性的初始值.当Map作为函数而不是构造函数调用时,它使用内部状态初始化它的值支持Map.prototype内置方法所必需的." 这也似乎表明他们都应该工作.
鉴于此,Map()虽然这是一种主观判断,但看起来更好,因为更短; 客观地说他们似乎可以互换?
是否有人能够解释ES6模块加载器(或Polyfills,如System.js,Webpack等)的简单import和System.import声明之间的区别
就像是
System.import('https://code.jquery.com/jquery.js').then();
Run Code Online (Sandbox Code Playgroud)
似乎是可能的,也是一种简单的
import 'jquery';
Run Code Online (Sandbox Code Playgroud)
是否System.import有import语句后回调的唯一可能性?
javascript ecmascript-harmony ecmascript-6 es6-module-loader
我在我的新Angular项目中转而使用ES6(Babel).ES6类不能有变量.我如何设置我的$ scope变量?
说我有一个简单的控制器:
class MainController {
constructor ($timeout, events) {
'ngInject';
this.textMaker = "Hello!" //Option #1
} // constructor
textMaker(){ //Option #2
return "Hello!";
}
}
export default MainController;
Run Code Online (Sandbox Code Playgroud)
我的html看起来像(在构建过程中控制器是自动注入的,比方说):
<h1> {{textMaker}}</h1>
Run Code Online (Sandbox Code Playgroud)
选项#1和选项#2似乎都不起作用.我得到一个空白的标题.这么简单的事情......我做错了什么?
javascript ecmascript-harmony angularjs ecmascript-6 angular-controller
所以,我有一个支持promises的nodejs:
$ node -v
v0.11.11
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用Promises时,我有一个错误:
$ node --harmony test.js
require, module, __filename, __dirname) { var promise = new Promise(fu
^
ReferenceError: Promise is not defined
at Object.<anonymous> (/home/just-boris/coding/test.js:1:89)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:349:32)
at Function.Module._load (module.js:305:12)
at Function.Module.runMain (module.js:490:10)
at startup (node.js:123:16)
at node.js:1128:3
Run Code Online (Sandbox Code Playgroud)
我的要点中的源代码
我做错了什么?此外,我尝试运行生成器示例并且它正在工作,因此这意味着es6功能已启用,但承诺除外
我是否正确地假设在浏览器足够支持时我可以从typescript代码库切换到纯ES6代码库?我试图回答的问题是我是否应该使用typescript或ES6 +编译器来es3/5.
Object.observe()回调的changes数组包含具有以下四个属性的对象:
为什么没有path本地提供的?例:
var ob = {
foo: [
{moo: "bar", val: 5},
{val: 8}
]
}
ob.foo[0].val = 1;
// callback should provide path "foo.0.val" or "foo[0].val"
Run Code Online (Sandbox Code Playgroud)
有一个Node.js模块扩展Object.observe()到也包括路径:observed.js,
但我担心本机的性能提升observe()会丢失(如果没有,请你解释它是如何实现的?).这也许可以browserify模块,但无法想象它会在同步环境表现良好,我仍然不知道为什么没有人似乎已经想到了一个额外的path属性.
javascript ×9
ecmascript-6 ×5
node.js ×3
typescript ×2
amd ×1
angularjs ×1
generator ×1
module ×1
observers ×1
promise ×1
proxies ×1
webpack ×1