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
的情况下执行它?