比较器函数ascending接受两个参数 - a和b.它必须返回一个比较两者的整数.
我有一个列表,我想按名称排序,所以我写了以下函数.
是否有一种功能习惯用法可以用来组合这两个功能,而不是byName负责编写结果函数?
const ascending = (a, b) => a.localeCompare(b);
const byName = (i) => i.get('name');
const useTogether = (...fns) => ...; // is there an idiomatic function like this?
// usage
items.sort(useTogether(byName(ascending)));
Run Code Online (Sandbox Code Playgroud) 以下 JavaScript 导致运行时在 OSX 10.15.2 上的 Chrome (v80.0.3987.116) 和 Firefox (v72.0.2) 上挂起。
为什么?
请注意,我将迭代器函数标记为async.
const iterable = {
async *[Symbol.iterator]() {
yield 'one'
}
}
console.log([...iterable])
Run Code Online (Sandbox Code Playgroud) 以下发出一个unhandledrejection事件,但似乎“工作”。
for...await 似乎通过发出异常来响应被拒绝的承诺(尽管在第一个承诺已经解决之后)。
我可以unhandledrejection使用Promise.alland避免该事件Promise.allSettled。以下代码是反模式吗?
async function asyncFunction() {
try {
const happy = new Promise((resolve)=>setTimeout(()=>resolve('success'), 1000))
const sad = new Promise((_,reject)=>setTimeout(()=>reject('failure')))
const promises = [happy, sad]
for await(const item of promises) {
console.log(item)
}
} catch (err) {
console.log(`an error occurred:`, err)
}
}
asyncFunction()Run Code Online (Sandbox Code Playgroud)
为什么map, foreach, andreduce不使用迭代器函数 on Symbol.iterator?
class MyArray extends Array {
*[Symbol.iterator]() {
for(let x = 0; x < this.length; x++) { yield this[x]*2 }
}
}
const log = console.log
const arr = new MyArray(1,2,3)
console.log([...arr]) // [2,4,6]
log(arr.map((i) => i)) // [1,2,3]Run Code Online (Sandbox Code Playgroud)
和:
const arr = [1,2,3]
Object.defineProperty(Object.getPrototypeOf(arr), Symbol.iterator, {
value: function*() {
for(let x = 0; x < this.length; x++) { yield this[x]*2 }
}
})
const log = console.log
log([...arr]) // …Run Code Online (Sandbox Code Playgroud)当承诺产生和消耗时,我对幕后发生的事情感到非常困惑。请澄清我的观点,并对我的英语不好表示歉意。
接下来发生什么 ?当then方法被调用时,方法的代码then会转到后台吗?我想它会进入后台,变量是 console.log // 10
主代码执行完成后,异步代码启动setTimeout回调开始执行,执行完成后,promise 得到满足,resolved 函数返回值。这个值如何存储在 Promise 对象中以及then方法中发生了什么?
let myPromise = new Promise (
(resolve, reject) => {
setTimeout(() => {
console.log(getIDs)
resolve(10);
}, 1500);
}
)
let a = 10
myPromise.then(val => {
console.log(val);
})
console.log(a)
Run Code Online (Sandbox Code Playgroud) TLDR:为什么函数参数不被视为var声明?
Using var,重新声明使用声明的变量var无效。原声明仍然有效。
但是,var以这种方式使用将屏蔽同名参数。
为什么语言是这样设计的?
在下文中, variablevar bar被视为新声明而不是 parameter 的重新声明bar。
function foo(bar = 0, bam = () => bar) {
var bar = 1
return bam()
}
console.log(foo()) // 0Run Code Online (Sandbox Code Playgroud)
是不是因为参数和局部变量在语义上根本不同,分为两类?
我可能希望参数被视为var声明,但事实并非如此。它们似乎在作用域链上自己的“盒子”中。
所以函数的作用域链是这样的:
function body >> parameter list >> outer function body >> outer parameter list >> ... global scope
Run Code Online (Sandbox Code Playgroud) 我想向内置cancel的子类添加一个方法。Promise为什么这不起作用?
class CancellablePromise extends Promise {
constructor(executor) {
let cancel = null
super((resolve,reject) => {
cancel = reject
executor(resolve, reject)
})
this.cancel = cancel
}
}
const p = new CancellablePromise((resolve) => setTimeout(resolve, 1000))
.then(() => console.log('success'))
.catch((err) => console.log('rejected', err))
p.cancel() // Uncaught exceptionRun Code Online (Sandbox Code Playgroud)
答案是 todo 吗Symbol.species?
我已经读过,基类中的私有变量在技术上是由子类继承的,但是不可访问.
如果这是正确的,为什么我们说它们是继承的,大概是它们只能通过反射来访问?
我想有一个约束返回两种类型之一的委托; 一个ActionResult或一个字符串.这可能吗?
javascript ×7
c# ×2
promise ×2
.net ×1
cancellation ×1
delegates ×1
ecmascript-6 ×1
es6-class ×1
es6-promise ×1
generics ×1
inheritance ×1