即使我明确输入了return,为什么 Promise 会返回一个对象 Promise?
好吧,因为这不是 Promise 的设计方式。承诺执行器回调函数的返回值根本没有被使用。
如果您想知道为什么它没有按照您希望的方式设计,您必须找到参与 Promise 构造函数及其执行函数的早期设计的实际工程师。
与我们相关的是“它是如何工作的”,而不是选择一个设计路径与另一个设计路径的真正原因。 var c = new Promise(...) 总是像大多数人期望的那样返回一个新创建的承诺。
并且,promise executor 函数用于允许您启动异步操作,然后最终使用resolve() 或reject() 跟踪其完成或错误。没有代码路径让您决定要返回一个值,这样new Promise() 应该只返回该值而不是返回一个新的承诺。所以,正如大多数人所期望的那样,new Promise() 总是返回一个 Promise,不管你在 Promise 执行器回调函数中做了什么。
您似乎已经知道,如果您想立即设置承诺的已解决值,那么您调用resolve(someValue) 并设置承诺的已解决值。
您可以通过.then() 或await 从承诺中获得价值。只有这两种方式。
我预计这里会有 return 而不是 Promise { pending }
首先,您必须意识到 promise 执行器回调函数是您提供的 new Promise() 构造函数。该构造函数创建一个新的 Promise 对象,创建唯一的解析和拒绝函数,并将它们作为参数传递给您提供的回调函数,然后调用该函数。它不关注该函数的返回值。这个 executor 函数和整个 Promise 初始化过程的设计者认为该函数的返回值是无关紧要的。有两种方法可以改变新承诺的状态,调用resolve(someValue) 或reject(someReason)。只有这两种方式。
其次,了解该函数中的 return 只是从您提供的回调函数返回,执行流程在 Promise 构造函数中完成,然后它从 new Promise() 构造函数返回并分配新的承诺你的变量c。那时已经创建了一个新的 Promise。如果承诺执行者没有调用resolve() 或reject(),那么新的承诺将处于pending 状态。如果resolve() 或reject() 被立即调用,那么promise 可能会被实现或被拒绝(它可以处于其他两种状态)。
new Promise() 不会返回您的值。
在您的特定代码中(调用resolve() put back in), you can get the value from the promise either like this with.then()`:
let c = new Promise((resolve, reject)=>{
console.log('here');
resolve('resolve here');
}).then(val => {
console.log(val);
});
或者使用await(在async函数内):
async function someFunction() {
let c = new Promise((resolve, reject)=>{
console.log('here');
resolve('resolve here');
});
let val = await c;
console.log(val);
}