为什么这个Javascript承诺不起作用?

时间:2018-03-08 16:06:42

标签: javascript node.js asynchronous promise

我正在学习承诺。

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代码移出路线功能的最佳做法是什么?

4 个答案:

答案 0 :(得分:8)

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

然后:您没有message函数的return语句,因此返回undefined

如果你想在回调函数中得到承诺的结果,你会传递给get,那么你需要:

  1. 退还承诺
  2. 在其上调用then
  3. 在传递给res.json(...);
  4. 的函数中使用then

    例如:

    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;
    }
    

答案 1 :(得分: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");
    });
}

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

答案 2 :(得分:1)

您可以从消息函数返回promise并在其上使用async / await,如:

{"Could not find a part of the path 'C:\\....many subfolders\\Extremely long filename'."}

像:



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




答案 3 :(得分:0)

函数消息不返回创建的promise。 通常你会有一个错误说:无法读取属性。然后是未定义的

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");
});

}