我正在学习承诺。
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
代码移出路线功能的最佳做法是什么?
答案 0 :(得分:8)
首先,您有一个名为message
的局部变量,它掩盖了具有相同名称并引用函数的模块级变量。你需要重命名其中一个。
然后:您没有message
函数的return语句,因此返回undefined
。
如果你想在回调函数中得到承诺的结果,你会传递给get
,那么你需要:
then
res.json(...);
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");
});
}