lodash中有_.merge功能.我想在ES6或ES7中实现同样的功能.
有这个片段:
Object.assign({}, {key: 2}, {key: undefined})
Run Code Online (Sandbox Code Playgroud)
我想收到{key: 2}.目前我收到了{key: undefined}
这不是深度合并.
可能吗?如果是,那么如何实现呢?
注意到在Java中没有找到async和await,ES7中的这些新关键字是从C#语言复制的吗?我很好奇它的起源:谁提出了关键字名称,JS社区中有人正在利用.NET框架中的概念吗?
我有一个使用WebPack的项目设置来使用ESLint,我想将ES7用于内联绑定操作符::.目前我收到如下所示的解析错误
/Users/ryanvice/Documents/Code/pluralsight-redux-starter/src/components/project/ProjectsPage.js (1/0)
? 7:27 Parsing error: Unexpected token :
/Users/ryanvice/Documents/Code/pluralsight-redux-starter/src/routes.js (2/2)
? 6:26 Parse errors in imported module './components/project/ProjectsPage': Unexpected token : (7:27) import/namespace
? 6:26 Parse errors in imported module './components/project/ProjectsPage': Unexpected token : (7:27) import/default
! 6:26 Parse errors in imported module './components/project/ProjectsPage': Unexpected token : (7:27) import/no-named-as-default
! 6:26 Parse errors in imported module './components/project/ProjectsPage': Unexpected token : (7:27) import/no-named-as-default-member
? 3 errors ! 2 warnings (4:45:40 PM)
Run Code Online (Sandbox Code Playgroud)
使用.eslintrc包括以下配置"ecmaVersion": 7
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查具有email提供的用户是否存在于集合中users,但我的函数对于每个调用都保持返回undefined.我使用es6并且async/await为了摆脱大量的回调.这是我的函数(它在一个类中):
async userExistsInDB(email) {
let userExists;
await MongoClient.connect('mongodb://127.0.0.1:27017/notificator', (err, db) => {
if (err) throw err;
let collection = db.collection('users');
userExists = collection.find({email: email}).count() > 0;
console.log(userExists);
db.close();
});
console.log(userExists);
return userExists;
}
Run Code Online (Sandbox Code Playgroud)
所以,调用console.log内部的第一个.connect总是返回,false因为返回的值.find不是数组,它是一个巨大的对象,如下所示:
{ connection: null,
server: null,
disconnectHandler:
{ s: { storedOps: [], storeOptions: [Object], topology: [Object] },
length: [Getter] },
bson: {},
ns: 'notificator.users',
cmd:
{ find: 'notificator.users',
limit: 0,
skip: 0,
query: …Run Code Online (Sandbox Code Playgroud) 我已经在这里以及这里查看了MDN资源,以及WhatWg Fetch Spec,以及如果Fetch API是ECMAScript 5,6,7或其他内容的一部分,我无法弄清楚.
我可以说的是,它并没有在浏览器中一致地实现,在某些情况下根本不受支持.
然而,规范明确定义Fetch为Javascript:
Fetch Standard还定义了fetch()JavaScript API
来源:链接
Fetch API是否仅仅是针对ES 7/8尚未出现的提案,还是它实际上是ES6/7/8的一部分而我的谷歌搜索技能让我失望了?
我不想读几个小时的代码来找到相关的部分,但我很好奇茉莉如何实现它的时钟.有趣的是它可以使用同步测试代码测试异步代码.AFAIK与当前node.js一起支持ES5,这是不可能的(异步函数在ES7中定义).它是用estraverse解析js代码并从同步测试中构建异步测试吗?
只是我所说的一个例子:
it("can test async code with sync testing code", function () {
jasmine.clock().install();
var i = 0;
var asyncIncrease = function () {
setTimeout(function () {
++i;
}, 1);
};
expect(i).toBe(0);
asyncIncrease();
expect(i).toBe(0);
jasmine.clock().tick(2);
expect(i).toBe(1);
jasmine.clock().uninstall();
});
Run Code Online (Sandbox Code Playgroud)
在这里expect(i).toBe(1);应该是一个回调.
我正在使用带有es7风格的异步/等待方法的babeljs.我有一个主脚本,它将在所有返回promises的对象数组上调用异步方法.我使用Promise.all()等待所有这些返回,但是,这些任务可能需要很长时间,如果它们超过阈值,我想中止所有这些,并且任务以适当的方式处理.
反正有没有完成这样的事情?目前,我能想到的唯一方法是生成一个进程,该进程执行调用这些方法的工作并等待它们全部解决,如果达到时间限制,它可以终止进程并执行它需要的任何处理.
更新:关于主脚本正在等待的这些方法的一些说明......他们可能正在进行一系列的操作(调用外部系统,某些地方的流文件等)而不执行可以独立取消的单个操作.
更新#2:一些未经测试的半伪代码
class Foo1 {
async doSomething() {
// call some external system
// copy some files
// put those files somewhere else (s3)
}
}
class Foo2 {
async doSomething() {
// Do some long computations
// Update some systems
}
}
class FooHandler {
constructor() {
this.fooList = [];
}
async start() {
await Promise.all(this.fooList.map(async (foo) => {
return await foo.doSomething();
}));
}
}
let handler = new FooHandler();
handler.fooList.push(new Foo1());
handler.fooList.push(new Foo2());
// if this …Run Code Online (Sandbox Code Playgroud) 我试图效仿这个例子:
https://github.com/gaearon/react-dnd/tree/master/examples/04%20Sortable/Simple
但代码是使用ES7,我不知道如何替换此文件中的装饰器和装饰依赖:
https://github.com/gaearon/react-dnd/blob/master/examples/04%20Sortable/Simple/Card.js
我试过阅读装饰器,但我只是不明白.我希望有人可以给出一个关于Card.js代码的ES6示例,这样我就可以更好地了解正在发生的事情并重写该示例供我自己使用.
我一直在阅读JavaScript中的装饰器,并认为我已经获得了基本的前提.
装饰器是函数,它们接收它们应该装饰的一个或多个参数,并返回结果.
但我@withStyles在React Boiler Plate项目中找到了一个装饰实现,我不明白它是如何工作的.
import React, { Component, PropTypes } from 'react';
function withStyles(...styles) {
return (BaseComponent) => class StyledComponent extends Component {
static contextTypes = {
insertCss: PropTypes.func.isRequired,
};
componentWillMount() {
this.removeCss = this.context.insertCss.apply(undefined, styles);
}
componentWillUnmount() {
this.removeCss();
}
render() {
return <BaseComponent {...this.props} />;
}
};
}
export default withStyles;
Run Code Online (Sandbox Code Playgroud)
用例就是
import s from './MyComponentStyle.scss';
@withStyles(s)
class MyComponent extends Component {
}
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
我很惊讶地发现,在Babel中,我可以import互相拥有两个模块而没有任何问题.我发现有一些地方将此称为Babel中已知和预期的行为.我知道这被广泛认为是很多(我猜的是最多)人的反模式,但请忽略这个问题:
有谁知道这是否(或将是)在ES6/7中的正确行为?
我能找到官方答案(和技术解释)最接近的是2ality.com上的评论
javascript circular-dependency ecmascript-6 babeljs ecmascript-7
ecmascript-7 ×10
javascript ×6
ecmascript-6 ×4
asynchronous ×2
babeljs ×2
decorator ×2
node.js ×2
reactjs ×2
api ×1
async-await ×1
babel ×1
c# ×1
eslint ×1
jasmine ×1
jasmine2.0 ×1
lodash ×1
mongodb ×1
webpack ×1