gpt4 book ai didi

javascript - ES6 原生 Promise from Factory 函数

转载 作者:行者123 更新时间:2023-11-28 03:45:32 27 4
gpt4 key购买 nike

我正在深入研究 ES6 原生 Promise。一路上我遇到了一些引用Douglas Crockford design choices的文章关于使用newObject.createthis等。有些人提倡使用Factory Functions超过构造函数。我还了解到有很多heated debate关于这些选择。因此,为了避免这个问题被列为没有建设性,我想问这个具体问题。

如何在不使用new的情况下为 Promise 创建工厂函数

// from [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)

var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});

console.log(promise1);
// expected output: [object Promise]

对于使用诸如为 fetch 构建 Headers() 之类的东西也是如此。

在工厂函数中的某个时刻,我必须编写:

new Promise();

DC 和其他作者是否仅指自定义对象,而不是内置对象?其他的怎么样API's需要使用new

最佳答案

如果您有一个“类类”函数,需要使用 new 关键字调用它,您可以使用 Object.create 函数将其转换为工厂函数。像这样

function Person(name) {
this.name = name;
}

Person.prototype.sayHi = function() {
console.log(this.name);
}

const makePerson = (name) => {
const person = Object.create(Person.prototype);

Person.call(person, name);

return person;
}

makePerson('Joe').sayHi()

但这不适用于 Promise,因为(来自规范)

Promise is not intended to be called as a function and will throw an exception when called in that manner.

const makePromise = (executor) => {
const promise = Object.create(Promise.prototype);

Promise.call(promise, executor); //this line throws

return promise;
}

try {
makePromise(resolve => setTimeout(resolve, 1000, 'Hi!')).then(console.log)
} catch(e) {
console.error('Crashed due to ', e.message)
}

再次但是有一个带有 Reflect API 的终极工厂 Reflect.construct 。因此,如果您想不惜一切代价避免使用 new,您可以这样做

const makePromise = (executor) => {
return Reflect.construct(Promise, [executor], Promise)
}

makePromise(resolve => setTimeout(resolve, 1000, 'Hi!'))
.then(console.log);

关于javascript - ES6 原生 Promise from Factory 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48515728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com