【问题标题】:Why this Javascript promise does not work?为什么这个 Javascript 承诺不起作用?
【发布时间】:2018-03-09 00:15:12
【问题描述】:

我正在学习承诺。

app.get('/message',function(req, res){    
    var promise = new Promise(function(resolve, reject){
        resolve("hi");
    });
    promise.then(function(message){
       res.json(message);
    })

});

这很好用。 虽然这太简单了。为了写一些“冗长”的东西,我将代码移出app.get() 并尝试从外部函数返回消息......就像这样:

    app.get('/message',function(req, res){ 
      var message = message(); // I also tried wrapping this in promise and calling `res.json` in `promise.then()` but no luck
       res.json(message);
    });

    function message(){    
        var promise = new Promise(function(resolve, reject){
            resolve("hi");
        });
        promise.then(function(message){
           return message;
        })

    }

那么为什么message() 函数中的return 语句不返回消息呢?以及将此类 promising 代码移出我的路由函数的最佳做法是什么?

【问题讨论】:

    标签: javascript node.js asynchronous promise


    【解决方案1】:

    首先,您有一个名为message 的局部变量,它掩盖了具有相同名称并引用函数的模块级变量。您需要重命名其中一个。

    那么:message 函数没有返回语句,所以它返回 undefined

    如果您想在传递给get 的回调函数中返回承诺的结果,那么您需要:

    1. 兑现承诺
    2. 拨打then就可以了
    3. 在传递给then 的函数中使用res.json(...);

    例如:

    app.get('/message',function(req, res){ 
      var my_message = message(); 
      my_message.then(function (data) {
         res.json(data);
     });
    });
    
    function message(){    
        var promise = new Promise(function(resolve, reject){
            resolve("hi");
        });
        return promise;
    }
    

    【讨论】:

      【解决方案2】:

      您的 message 函数不返回任何内容。

      你可以这样做:

      app.get('/message',function(req, res){
          message().then(function (message) {
              res.json(message);
          }
      });
      
      function message() {    
          return new Promise(function(resolve, reject){
              resolve("hi");
          });
      }
      

      另外,请注意不要为多个变量使用相同的名称,因为这会使代码由于可读性较差而容易出错。

      【讨论】:

      • 比我快 :) 如果他想学习 Promise,解释一下我的回答中的 chainen 方面可能会有所帮助(return promise.then(function(msg) { return msg})跨度>
      【解决方案3】:

      你可以从你的消息函数中返回 Promise 并在其上使用 async/await,如下所示:

      app.get('/message', async function(req, res){
          var msg = await message();
          res.json(msg);
      });
      function message() {    
          return new Promise(function(resolve, reject){
              resolve("hi");
          });
      }
      

      喜欢:

      function message() {
        return new Promise(function(resolve, reject) {
          setTimeout(resolve, 1500, 'hi');
        });
      }
      
      async function go() {
        console.log('Async call started...');
        var msg = await message();
        console.log(msg);
      }
      
      go();

      【讨论】:

        【解决方案4】:

        函数消息不返回创建的承诺。 通常你会有一个错误说:cannot read property .then of undefined

        function message(){    
            var promise = new Promise(function(resolve, reject){
                resolve("hi");
            });
            return promise.then(function(message){  // This will return the initial promise. Due to to the .then, that promise is chained into resolving into the message
               return message;
            })
        
        }
        

        它可以被缩短(如果你不希望 .then 在你的消息函数中。 然后返回承诺:

        function message(){    
        return new Promise(function(resolve, reject){
            resolve("hi");
        });
        

        }

        【讨论】:

          猜你喜欢
          • 2022-01-15
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-07
          • 1970-01-01
          • 2012-02-22
          • 2016-12-22
          相关资源
          最近更新 更多