繁体   English   中英

为什么此Javascript承诺不起作用?

[英]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 ,那么你需要:

  1. 兑现承诺
  2. then打电话
  3. 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM