鉴于一系列承诺,在ES7中获得结果的惯用方法是什么?
这就是我想要做的事情:
async function getImports() {
let imports = [System.import('./package1.js'), System.import('./package2.js')];
let promises = await* imports;
let results = [];
await promises.forEach(val => val.then(data => results.push(data))); //seems hacky
console.log(results); // array of 2 resolved imports
}
Run Code Online (Sandbox Code Playgroud)
结果是正确的,但我仍然在做a forEach和a then将已解决的承诺转化为结果.这对我来说似乎不对.有更干净的方式吗?
我使用ES6每个我的文章的WebPack ES6-transpiler这里:http://www.railsonmaui.com/blog/2014/10/02/integrating-webpack-and-the-es6-transpiler-into-an-现有的护栏项目/
将两个Singleton对象转换为使用ES6类是否有意义?
import { CHANGE_EVENT } from "../constants/Constants";
var EventEmitter = require('events').EventEmitter;
var merge = require('react/lib/merge');
var _flash = null;
var BaseStore = merge(EventEmitter.prototype, {
emitChange: function() {
this.emit(CHANGE_EVENT);
},
/**
* @param {function} callback
*/
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
/**
* @param {function} callback
*/
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
},
getFlash: function() {
return _flash;
},
setFlash: function(flash) {
_flash = flash;
}
});
export { BaseStore };
Run Code Online (Sandbox Code Playgroud)
这是文件ManagerProducts.jsx,它有一个应该从BaseStore扩展的单例.
/**
* Client side store …Run Code Online (Sandbox Code Playgroud) 尝试使用新的基于ES6的node.js用于Mongo的ODM(Robe http://hiddentao.github.io/robe/)
获得"意外严格模式保留字"错误.我在这里错了吗?
test0.js
"use strict";
// Random ES6 (works)
{ let a = 'I am declared inside an anonymous block'; }
var Robe = require('robe');
// :(
var db1 = yield Robe.connect('127.0.0.1');
Run Code Online (Sandbox Code Playgroud)
运行:
C:\TestWS>node --version
v0.11.10
C:\TestWS>node --harmony test0.js
C:\TestWS\test0.js:12
var db1 = yield Robe.connect('127.0.0.1');
^^^^^
SyntaxError: Unexpected strict mode reserved word
at exports.runInThisContext (vm.js:69:16)
at Module._compile (module.js:432:25)
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:1031:3
Run Code Online (Sandbox Code Playgroud) 我有一个简单的日志功能:
function log(str) {
console.log('logged: ', str);
}
Run Code Online (Sandbox Code Playgroud)
如果我在没有括号的情况下调用它(目前使用Chrome的开发工具)并传入模板字符串,如下所示:
log`foo`
Run Code Online (Sandbox Code Playgroud)
输出是: logged: ["foo", raw: Array[1]]
如果我用括号称呼它,
log(`foo`)
Run Code Online (Sandbox Code Playgroud)
输出是: logged: foo
为什么在Javascript中使用模板字符串调用函数没有括号?发生了什么导致结果与用括号调用结果不同?
javascript ecmascript-harmony ecmascript-6 template-strings ecmascript-2015
是否可以在nodejs中启用EcmaScript 6 Harmony Proxies?如果是这样,有什么优点和缺点?有没有关于如何使用它们的文档?谢谢 !
如果您真的知道答案或可以提供一些信息,这是一个合理的问题.
Firefox和Chrome一直致力于包含ES Harmony中的许多功能......
我的问题实际上是两个部分:
除了常规功能和内置功能之外,还有一种优雅的方式可以告诉Harmony的纤细箭头功能吗?
在和谐维基指出:
箭头函数就像内置函数一样缺乏.prototype和任何[[Construct]]内部方法.所以new(()=> {})抛出一个TypeError,否则箭头就像函数一样
这意味着,您可以测试箭头功能,如:
!(()=>{}).hasOwnProperty("prototype") // true
!(function(){}).hasOwnProperty("prototype") // false
Run Code Online (Sandbox Code Playgroud)
但是测试也将返回true任何内置函数,例如setTimeout或Math.min.
如果您获得源代码并检查它是否可以在Firefox中运行"native code",但它看起来不太可靠也不可移植(其他浏览器实现,NodeJS/iojs):
setTimeout.toSource().indexOf("[native code]") > -1
Run Code Online (Sandbox Code Playgroud)
小的GitHub项目node-is-arrow-function依赖于函数源代码的RegExp检查,这不是那么整洁.
编辑:我尝试了一下JavaScript解析器橡子,看起来工作得很好 - 即使它太过分了.
acorn = require("./acorn");
function fn_sample(a,b){
c = (d,e) => d-e;
f = c(--a, b) * (b, a);
return f;
}
function test(fn){
fn = fn || fn_sample;
try {
acorn.parse("(" + fn.toString() + ")", {
ecmaVersion: 6,
onToken: function(token){ …Run Code Online (Sandbox Code Playgroud) javascript function ecmascript-harmony ecmascript-6 arrow-functions
最近生成器在NodeJS中启动,我可以做类似的事情:
Promise.coroutine(function *(query){
var handle = yield db.connect(Settings.connectionString); //async, returns promise
var result = yield db.query(query); // async, returns promise
return result;
});
Run Code Online (Sandbox Code Playgroud)
现在生成器非常棒,因为它们让我在JS中执行async/await.我真的很想能够做到这一点.
但是,出现了一个问题.生成器使用try/catch块,所以假设我的代码如下所示:
Promise.coroutine(function *(){
try{
var db = yield DBEngine.open("northwind"); // returns promise
var result = yield db.query("SELECT name FROM users"); // returns promise
return res;
} catch (e){
//code to handle exception in DB query
}
});
Run Code Online (Sandbox Code Playgroud)
(注意,Promise.coroutine来自蓝鸟)
注意这个bug?但是有一个参考错误 - 捕获会吞下它.
当我在95%的情况下放置try/catch时,我想要捕获的是逻辑错误和I/O错误,而不是语法或类型错误.我想要非常清楚这些.回调使用err第一个参数,在生成器中,我不确定替换是什么.
一个好的解决方案可以让我保持堆栈跟踪.
我试图用WeakMaps 做明显的事情:我想创建一个弱引用.特别是,我想要一个没有该列表影响监听器生命的事件监听器列表.
所以我很高兴能找到WeakMaps,直到我看到它们只是为了满足一个(相当罕见的)用例,扩展其他密封的对象.当我想要这样做时,我想不到,但我一直都需要听众列表.
这有可能以一些我没有想到的聪明方式使用WeakMaps吗?
javascript weak-references ecmascript-harmony weakmap ecmascript-6
我尝试在我的node.js/express app上创建一个类.
它适用于基本的js/prototype模式,例如:
function MyClass() {
/* constructor code */
};
MyClass.prototype.myMethod = function() {
/* method code */
};
module.exports = MyClass;
Run Code Online (Sandbox Code Playgroud)
但我想使用class,constructor,extends,...关键字.
我试过了:
class MyClass {
constructor() {
/* constructor code */
}
myMethod() {
/* method code */
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,错误是:
class MyClass {
^^^^^
SyntaxError: Unexpected reserved word
Run Code Online (Sandbox Code Playgroud)
我的命令行用于启动具有所有和声选项的应用程序:
node `node --v8-options | grep harmony | cut -d ' ' -f | xargs` my-app.js
Run Code Online (Sandbox Code Playgroud)
想要正确启动我的应用程序的想法吗?
javascript ×8
ecmascript-6 ×7
node.js ×3
ecmascript-7 ×1
express ×1
function ×1
generator ×1
weakmap ×1