Javascript 创建没有新关键字的承诺
看了之后,我决定不使用Javascript 创建没有新关键字的承诺,javascript,promise,Javascript,Promise,看了之后,我决定不使用new关键字 但这里有一个如何使用承诺的基本示例: var promise = new Promise(function(resolve, reject) { // do a thing, possibly async, then… if (/* everything turned out fine */) { resolve("Stuff worked!"); } else { reject(Error("It broke")); }
new
关键字
但这里有一个如何使用承诺的基本示例:
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
问:如何在不使用
new
关键字的情况下创建承诺?使用async/await
const getPromise = async () => {
// do a thing, possibly async, then…
if (/* everything turned out fine */) {
return 'Stuff worked!'
} else {
throw 'It broke'
}
});
const promise = getPromise()
但请认识到,您不能只调用Error
,在没有new
关键字的情况下调用构造函数,从而将垃圾扔到NodeJS中的全局
对象(或浏览器JS中的窗口
对象)。您必须使用新错误
。我希望我没有给你带来一个全新的问题
另外,请注意,
async/await
只是一个语法糖,代码无论如何都将与new
一起运行。此外,我建议不要从字面上接受建议。诚然,new
是邪恶的,但有时为了不使事情过于复杂,这是必要的。作为一个纯粹的学术问题,你可以通过创建一个thenable(你不需要new
)来解决new
),然后你可以用promise将该能力转化为一个全面的承诺。解决:
函数createPromise(执行器){
让我们回拨;
函数解析(解析,arg){
Promise.resolve().then(函数(){
回调[决议](arg);
});
}
试一试{
执行人(resolve.bind(null,“履行”)、resolve.bind(null,“拒绝”);
}捕获(e){
决定(“拒绝”,e);
}
返回承诺。解决({
然后:功能(完成、拒绝){
回调={完成,拒绝};
}
});
}
//演示
var prom1=createPromise(函数(解析、拒绝){
setTimeout(函数(){resolve(“Stuff-worked!”)},1000);
});
var prom2=createPromise(函数(解析、拒绝){
setTimeout(函数(){reject(“It break”)},1000);
});
prom1.then(函数(v){console.log(v);});
prom2.catch(函数(err){console.log(err)});
log(“等待承诺解决”)代码>您可以使用包装器函数:
const Guarantee = function () {
var _resolve = null
var _reject = null
var promise = new Promise(function (resolve, reject) {
_resolve = resolve
_reject = reject
})
promise.resolve = function () {
_resolve.apply(promise, arguments)
}
promise.reject = function () {
_resolve.apply(promise, arguments)
}
return promise
}
function doSomething () {
const promise = Guarantee()
setTimeout(function () {
promise.resolve('123')
}, 1000)
return promise
}
doSomething()
.then(function (data) {
console.log(data)
})
享受吧 MDN's和
手册页显示了这些函数如何返回,然后返回
下面的代码片段进一步说明了如何使用它们使myFunc
wrap\u myFunc
返回,然后
启用
“严格”;
函数_myFunc(tf){
如果(tf)
返回;
抛出新错误(“出错”);
}
函数myFunc(tf){
尝试{return Promise.resolve(_myFunc(tf));}
捕获(e){返回承诺。拒绝(e);}
}
函数main(){
试一试{
_myFunc(假);
console.log('SUCCESS');
}捕获(e){
log(`FAILED:${e.message}`);
}
试一试{
_myFunc(真);
console.log('SUCCESS');
}捕获(e){
log(`FAILED:${e.message}`);
}
myFunc(假)
.then(()=>{console.log('success');})
.catch((e)=>{console.log(`failed:${e.message}`);});
myFunc(真)
.then(()=>{console.log('success');})
.catch((e)=>{console.log(`failed:${e.message}`);});
}
main()
为什么您决定不使用new
关键字?你看了并理解了视频吗?你可以完全按照视频中的例子。。。不确定你想要完成什么。承诺是一个目标。如果是这样,则应与new
一起使用,以创建此对象的新示例…不要信任YouTube上观看的每一个视频。@Sergey,new
不会创建Promise
对象的新示例Promise
是一个构造函数(函数)。您创建了Promise.prototype
,而不是Promise
。避免使用受支持的、易于理解的简单方法创建Promise似乎是一个毫无意义的目标。dude?真正地拜托,这是一个严肃的网站。当然,这是一个严肃的回答,有什么问题吗?没有问题;-)实际上,他也建议不要使用async Wait。您不必使用new
来创建新的错误,error(…)
也可以作为工厂函数()。为什么这么复杂?为什么不创建一个工厂函数:函数createPromise(executor){returnnewpromise(executor);}
,因为问题是在不使用new
的情况下执行它?