标签: ecmascript-2016

获取导致 Fetch 中 json 解析错误的有效负载

我有以下用于发出 POST 请求的代码。我对这里的错误处理不是 100% 确定,但对我来说,当请求不成功时获取正文很重要。

我仍然遇到的一个问题是 - 如果服务器响应 200 OK 但无效 json - 我可以记录该有效负载吗?Fetch 的正确记录方式是什么?

           Fetch(data.notificationUrl, {
                method: 'POST',
                body: post_data,
                headers: {
                    'Content-Type': 'application/json'
                }
            }).then((res) => {

                if (!res.ok) {
                    // Could reject the promise here but than response text wouldn't be available
                    //return Promise.reject(`Response was not OK. Status code: ${res.status} text: ${res.statusText}`);
                    return res.text().then((txt) => `Response was not OK. Status code: ${res.status} text: ${res.statusText}.\nResponse: ${txt}`);
                }
                // response ok so we should return json, could follow https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch …
Run Code Online (Sandbox Code Playgroud)

javascript fetch node.js ecmascript-2016

4
推荐指数
1
解决办法
7800
查看次数

Node.js - 缓冲数据到 Ffmpeg

我使用 Node.js 和 Ffmpeg 来创建动画。因为我试图避免使用第三方 avi/mp4 解析器,所以我决定将动画输出为原始 rgb24 数据文件,然后使用一些程序将其转换为 mp4 文件。

我发现 Ffmpeg 是免费和开源的,它可以做到这一点。因此,我制作了一个 Node.js 应用程序,它分配了一个Buffer大小1920 x 1080 x 3(宽度乘以高度乘以每个像素的字节数),然后我创建了一个渲染上下文库,最后我逐帧动画并将每一帧连续保存在一个二进制文件中(使用fs模块)。

然后我调用 Ffmpeg 将其转换为 mp4 文件,效果很好。动画很容易制作,而且 Ffmpeg 可以正确地完成它的工作。

但是,唯一的问题是它非常慢并且会占用硬盘空间。我想制作很长的动画(一个多小时)。最终的 mp4 文件相对较小,但原始视频文件非常大。每帧大约百分之九十是黑色像素,因此 Ffmpeg 压缩它非常好,但原始文件无法压缩,有时需要超过 100 GB。此外,有非常不必要的双重处理相同的数据。首先我在 Node.js 中处理它以将数据保存到文件,然后 Ffmpeg 读取它以将其转换为 mp4。有很多不必要的工作。

所以,我正在寻找一种方法(我很确定这是可能的,但我还没有找到一种方法来做到这一点)将原始视频数据(一次一帧)输出到 Ffmpeg 进程(没有将任何内容保存到硬盘)。

我的目标是做到以下几点:

  1. 打开ffmpeg进程
  2. 在 Node.js 中渲染帧
  3. 输出原始字节流到 Ffmpeg
  4. 等待 Ffmpeg 对其进行编码并附加到 mp4 文件
  5. 让 Ffmpeg 等待我的 Node.js 进程渲染下一帧

有没有办法实现它?我真的没有理由发布代码,因为我当前的代码与我在这里提出的问题无关。我不会为语法错误或实现问题而烦恼。不,相反,我只是不知道将哪些参数传递给 Ffmpeg 进程以实现我已经解释过的内容。

我在文档中搜索以找出我需要传递给 Ffmpeg 进程的参数,以便让它从标准输入而不是从文件中读取原始数据,并等待我的 Node.js 进程渲染下一帧(因此禁用时间限制),因为渲染一帧可能需要 24 …

javascript windows ffmpeg node.js ecmascript-2016

4
推荐指数
1
解决办法
4598
查看次数

JavaScript指数一元运算符设计决策

所以我在使用新的取幂运算符,我发现你不能在基数之前放置一元运算符.

let result = -2 ** 2; // syntax error
let result = -(2 ** 2); // -4
let x = 3;
let result = --x ** 2; // 4
Run Code Online (Sandbox Code Playgroud)

从MDN的文档:

在JavaScript中,这是不可能写出暧昧幂表达式,即你不能把一元运算符(+/ -/ ~/ !/ delete/ void/ typeof)之前的基数.

在大多数语言(如PHP和Python)和其他具有取幂运算符(通常^或者**)的语言中,指数运算符被定义为具有比一元运算符(如一元+和一元)更高的优先级-,但也有一些例外.例如,在Bash中,**运算符被定义为具有比一元运算符更低的优先级.

我知道这是一个错误的设计.我不明白这个设计决定.谁是真的会感到惊讶,这-x ** 2是消极的?这不仅遵循其他主流编程语言,而且是数百年来常用的数学符号,并且教给每个高中代数学生.

在Javascript '1'+ 2是'12'和'1'-2是-1,但-1**2提出了一个错误,因为它可能是模糊的?帮助我理解这个设计决定.

javascript operator-precedence exponentiation ecmascript-2016

4
推荐指数
1
解决办法
149
查看次数

检查字符串是否包含数组中存在的任何关键字

我想在此基础上的关键字存在于一个数组来过滤一些内容,但不知道该怎么做,尝试使用includes,indexof和search功能,但它并没有我的情况下工作.

我的第一次尝试:

const filters = ['movie', 'food']
contents
 .filter( content => filters.includes(content.name))
Run Code Online (Sandbox Code Playgroud)

问题是这content.name是一个包含多个单词的字符串,例如"看你最喜欢的电影","投票给你最喜欢的食物"等等,我想检查一个字符串是否包含过滤器变量中的一个关键字.目前includes()返回,false因为它试图匹配确切的字符串.

javascript ecmascript-6 ecmascript-2016

4
推荐指数
1
解决办法
683
查看次数

如何使用 async-await 停止执行下一个函数?

我正在使用这个库在我的 nodejs 应用程序中链接异步函数:https : //github.com/yortus/asyncawait

var chain = async(function(){

    var foo = await(bar());
    var foo2 = await(bar2());
    var foo3 = await(bar2());

}
Run Code Online (Sandbox Code Playgroud)

所以 bar3 等待 bar2 完成,而 bar2 等待 bar() 完成。没关系。但是我该怎么做才能阻止异步块进一步执行?我的意思是这样的:

var chain = async(function(){

    var foo = await(bar());
    if(!foo){return false;} // if bar returned false, quit the async block
    var foo2 = await(bar2());
    var foo3 = await(bar2());

}
Run Code Online (Sandbox Code Playgroud)

处理这个问题的最佳方法是什么?

目前我在 bar 内抛出异常并以如下方式处理异常:

chain().catch(function (err) { //handler, ie log message)
Run Code Online (Sandbox Code Playgroud)

它正在工作,但看起来不对

javascript node.js async-await ecmascript-2016

3
推荐指数
1
解决办法
3323
查看次数

在 cluster.on 上使用 babel 的 ES6 和 ES2016 之间的不同行为

我正在尝试使用集群来利用多核 CPU 的优势。用代码:

var cluster = require('cluster');

if (cluster.isMaster) {
    for(var i = 0; i < 2; ++i) {
        cluster.fork();
    }
    cluster.on('exit', function (worker) {
        console.log('Worker ' + worker.process.pid + ' exitted.');
    });
} else {
    console.log('Worker ' + cluster.worker.process.pid);
    process.exit(0);
}
Run Code Online (Sandbox Code Playgroud)

节点与输出完美配合

Worker 14058
Worker 14064
Worker 14058 exitted.
Worker 14064 exitted.
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试import与 babel 一起使用时,我遇到了问题:

import *  as cluster from 'cluster'

if (cluster.isMaster) {
    for(let i = 0; i < 2; ++i) {
        cluster.fork();
    }
    cluster.on('exit', (worker) …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6 ecmascript-2016

3
推荐指数
1
解决办法
1083
查看次数

是否有我应该使用 in 运算符而不是 hasOwnProperty() 的情况?

在 JavaScript 中,in运算符检查对象是否具有指定的属性。但是,它不仅检查对象自身的属性,还检查原型链。因此,在某些情况下,它的行为可能不完全符合预期。

假设出于某种原因,我们有一个someArrayMethods包含(显然)一些数组方法作为键的对象:

const someArrayMethods = {
  indexOf: true,
  map: true,
};
Run Code Online (Sandbox Code Playgroud)

我们可以使用in运算符检查该对象是否具有特定方法作为键:

console.log('indexOf' in someArrayMethods); // true
console.log('every' in someArrayMethods); // false
Run Code Online (Sandbox Code Playgroud)

如果我们试图检查toString财产怎么办?

console.log('toString' in someArrayMethods); // true
Run Code Online (Sandbox Code Playgroud)

惊喜!事实证明,这个对象在原型链中有一个toString方法,所以即使该对象没有自己的属性,in操作符true也会返回toString。

这hasOwnProperty()就是拯救的地方!它与in操作符几乎相同,只有一个区别:它不检查原型链。我们可以重写我们之前的例子:

console.log(someArrayMethods.hasOwnProperty('toString'));  // false
Run Code Online (Sandbox Code Playgroud)

现在它按预期工作。不幸的是,hasOwnProperty()在一种情况下也可能失败。如果我们有一个拥有自己属性的对象 hasOwnProperty 怎么办?看这个例子:

const someObject = {
  hasOwnProperty() {
    return false;
  },
  theAnswer: 42,
};

// Does `someObject` has own property `theAnswer`? …
Run Code Online (Sandbox Code Playgroud)

javascript prototype object hasownproperty ecmascript-2016

3
推荐指数
1
解决办法
439
查看次数

TypeScript 装饰器,获取构造函数参数类型和注入

假设您有一个这样的类,并且Router附加了装饰器。

@Router
class AuthRouter {

    constructor(private cacheService: CacheService) {}
}
Run Code Online (Sandbox Code Playgroud)

如何从Router装饰器中获取构造函数参数类型?假设我们已经存储了一个CacheService我们可以访问的单例,如果我们知道类名“CacheService”。

function Router(target) {

    // somehow get the constructor class name
    const dependencyNames = 'CacheService' // an array if multiple args in constructor

    // getSingleton is a function that will retrieve
    // a singleton of the requested class / object
    return new target(getSingleton(dependencyNames))
}
Run Code Online (Sandbox Code Playgroud)

所以无论何时我们使用AuthRouter,它都会CacheService已经注入其中。

decorator typescript ecmascript-2016

3
推荐指数
1
解决办法
2205
查看次数

这个交换数组元素的函数是如何工作的?

我在这里看到这个函数会交换两个数组元素,但我似乎无法弄清楚它是如何工作的。看起来正在进行某种数组解构(?)。我只是不明白原始data-array 是如何以及为什么被改变的。

有人可以向我解释这是如何工作的吗?

const swap = (a, i, j) => {
  [a[i], a[j]] = [a[j], a[i]]  // ???
}

const data = [1, 2, 3, 4]

swap(data, 0, 2)

console.log(data)
Run Code Online (Sandbox Code Playgroud)

javascript swap destructuring ecmascript-2016

3
推荐指数
1
解决办法
82
查看次数

JavaScript 开发人员如何找到接口的实现类?

我正在学习 JavaScript,我来自 Java。

Java 开发人员可以轻松评估接口的有用性,因为所有已知的实现类都已记录在案。请点击此处查看示例。

JavaScript 中情况并非如此。例如,对于可迭代对象,下面的链接仅显示了可迭代对象的几个示例。它们没有显示所有内置类和 DOM 类的实现。(例如,他们提到“像 NodeList 这样的集合类型也是可迭代的”。那么,除了 NodeList 之外,我怎样才能找到其他可迭代的 DOM 类?是否有一些我可以运行的 JS 代码来实现这一点?谢谢!)

JavaScript 开发人员如何找到接口的实现类?

谢谢!

关于可迭代的 MDN 文档:

更新1:

我正在寻找的是可以进入Array.from()第一个参数的迭代。谢谢!

javascript iterator iterable ecmascript-6 ecmascript-2016

3
推荐指数
1
解决办法
218
查看次数