【问题标题】:Why does a Promise return an object Promise, even if I put `return` explicitly? [duplicate]为什么一个 Promise 会返回一个对象 Promise,即使我明确地放了`return`? [复制]
【发布时间】:2019-08-15 03:53:17
【问题描述】:

我预计 Promise 会返回我输入的值。 但它不返回值,而是返回 Promise { pending }

var c = new Promise((resolve, reject)=>{
    console.log('here');
    return 'return here';
    // resolve('resolve here')
});

console.log(c);

我预计会有return here 而不是Promise { pending }

【问题讨论】:

    标签: javascript node.js promise


    【解决方案1】:

    即使我明确输入了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);
    }
    

    【讨论】:

      【解决方案2】:

      这不是 Promise 的工作方式。承诺的重点是控制执行流程。在 promise 解决之前,你不会得到值:

      var c = new Promise((resolve, reject)=>{
          console.log('here');
          // return 'return here';
          resolve('resolve here')
      });
      
      c.then(result => {
         console.log(result)
      })

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          Promise 表示异步计算,因此您无法同步访问其结果,您需要使用.then() 链接回调,请参阅文档here

          这是一个工作示例:

          const c = new Promise((resolve, reject)=>{
              resolve('resolve here')
          });
          
          c.then(value => console.log(value));

          【讨论】:

            【解决方案5】:

            这不是使用 Promise 的正确方式。您必须解决承诺并使用 then 方法来查看已解决的承诺。

            你必须这样做:

            var c = new Promise((resolve, reject)=>{
                console.log('here');
                //return 'return here';
                resolve('resolve here')
            });
            
            c.then(function(value) {
              console.log(value);
            });
            

            【讨论】:

              【解决方案6】:

              您应该使用 resolve 而不是 return。以上完美回答了您的问题。

              const c = new Promise((resolve, reject)=>{
                console.log('here');
                resolve('resolve here')
              });
              c().then((answer) => console.log(answer))
              

              【讨论】:

                猜你喜欢
                • 2017-11-11
                • 2018-06-01
                • 1970-01-01
                • 2015-09-01
                • 2017-01-19
                • 2021-08-23
                • 2018-04-18
                • 1970-01-01
                相关资源
                最近更新 更多