Promise构造函数的静态方法

4

我正在检查Promise构造函数的静态方法。当我在控制台记录Promise构造函数属性时,我看到了resolve和reject方法:

console.log(Object.getOwnPropertyNames(Promise))
// Array(7) [ "all", "race", "reject", "resolve", "prototype", "length", "name" ]

我想知道resolve和reject方法是不是在执行器(executor)中作为其参数使用的相同方法,还是它们是单独的不同事物:
const myFirstPromise = new Promise((resolve, reject) => {
//   do something asynchronous which eventually calls either:
//
//   resolve(someValue); // fulfilled
//   or
//   reject("failure reason"); // rejected
});

规范提到了 Promise Resolve 函数和 Promise.resolve(x),它是 %Promise_resolve% 内部对象。请问这两者是否相同?
2个回答

4
您在console.log()输出中看到的属性是全局JavaScript Promise对象的.resolve().reject()属性。您可以将它们视为Promise类的静态类方法。使用它们创建新的已解析/已拒绝Promise对象:
const p1 = Promise.resolve(3);
console.log(await p1);
// 3

你所调用的 promisereject 参数:
const myFirstPromise = new Promise((resolve, reject) => {
   if (rand() < 0.5) {
       resolve(3);
   } else {
       reject(new Error('not today'));
   }
});

只是函数参数。它们可以被命名为任何您想要的名称;它们仅在您作为参数传递给Promise构造函数的执行函数中可见。

它们与Promise.resolve()Promise.reject()没有任何关联或相关性。

上述代码也可以编写为:

const f1 = (resolve, reject) => {
   if (rand() < 0.5) {
       resolve(3);
   } else {
       reject(new Error('not today'));
   }
};

const myFirstPromise = new Promise(f1);

这样更加清晰地表明 resolverejectmyFirstPromise 或任何 Promise 没有任何关系。它们只是函数 f1 的局部变量。


那解释了很多事情。我有点困惑,因为规格说明不太清楚。 - kilogram
一个 Promise 的 resolve 函数是一个匿名内置函数,它具有 [[Promise]] 和 [[AlreadyResolved]] 内部插槽。 - kilogram

0

Promise.resolve 是一个快捷方式,用于“获取一个值或一个 Promise 并将其包装在一个 Promise 中返回”。myPromise = Promise.resolve("myVal") 是一种更简短的方式。

myPromise = new Promise((resolve) => resolve("myVal"))

Promise.reject做的事情是一样的,只不过显然是拒绝而不是解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接