[英]Why this Javascript promise does not work?
我正在学习诺言。
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
代码移出路由功能的最佳实践是什么?
首先,您有一个名为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;
}
您的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,并在其上使用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();
该功能消息不返回创建的承诺。 通常,您会遇到一个错误:无法读取属性.then的未定义
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。只需返回promise然后:
function message(){
return new Promise(function(resolve, reject){
resolve("hi");
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.