【问题标题】:How to execute a promise in nodejs with express如何使用express在nodejs中执行promise
【发布时间】:2018-01-21 18:45:09
【问题描述】:

所以我是 Node 新手,我一直在尝试使用 Promise 做一些工作。我的问题是我似乎无法让我的端点“异步”执行它的代码。这个想法是我的端点执行“列表”函数,该函数应该将单词注销到控制台并将“真”返回给响应。我的承诺只是等待五秒钟,然后打印出“承诺”。我期待控制台打印“之前”“之后”“承诺”(按此顺序),但我得到“之前”“承诺”“之后”,这在我看来是同步执行。列表函数不应该移动到代码的最后一行('After')而不是等待 promise 解决/拒绝吗?

var log4js = require('log4js');
var logger = log4js.getLogger('controller');
var Promise = require('promise');

function pause(milliseconds) {
    var dt = new Date();
    while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}

var listPromise = function(){
    return new Promise(function (resolve, reject){
        var flag = true;

        try{
            pause(5000);
            console.log('Promise');
        }catch(err){
            logger.error('Error');
        }

        if(flag){
            resolve(flag);
        }else{
            reject(Error("Could not execute"));
        }
    });
}

 exports.list = function(req, res) {

     console.log('Before');

     listPromise().then(function(fulfilled) {
         res.json(fulfilled);
     })
     .catch(function (error) {
         res.send(error.message);
     });

     console.log('After');
 };

【问题讨论】:

  • Promise 不会被“执行”,你不能使用它们来并行执行阻塞代码。它们是代表某些异步操作的未来结果的值,仅此而已。您的 pause 函数不是异步的,这很糟糕 - 请改用 setTimeout
  • 好吧,我想我开始明白了。承诺中的代码应该是异步的。例如,如果我将 setTimeout() 与回调函数一起使用?
  • 是的。我已在答案中举例说明了我的评论。

标签: javascript node.js express promise


【解决方案1】:

Promise 不会“执行”,您不能使用它们并行执行阻塞代码。它们是代表某些异步操作的未来结果的值,仅此而已。您的 pause 函数不是异步的,这很糟糕 - 请改用 setTimeout。回调实际上是异步的:

function pause(milliseconds) {
    return new Promise(function (resolve, reject) {
        setTimeout(resolve, milliseconds);
        console.log('Promise executor');
    });
}

exports.list = function(req, res) {
     console.log('Before');
     pause(5000).then(function(fulfilled) {
         console.log("Promise callback");
         res.json(fulfilled);
     })
     .catch(function (error) {
         res.send(error.message);
     });
     console.log('After');
};

这将记录BeforePromise executorAfter,然后在五秒钟后记录Promise callback

【讨论】:

    【解决方案2】:

    您的listPromise 函数并不是真正的异步函数,它只返回承诺。 使用setTimeout函数模拟异步操作:

    let listPromise = () => {
        return new Promise(resolve => {
            setTimeout(_ => {
               console.log('Promise');
               resolve(true);
            }, 1000);
        });
    }
    
    let list = () => {
         console.log('Before');
    
         listPromise()
             .then(fulfilled => console.log(fulfilled))
             .catch(err => console.log(err));
    
         console.log('After');
     };
     
     list();

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 2015-11-14
      • 2021-07-03
      • 2021-02-19
      • 1970-01-01
      • 2016-05-04
      • 2018-07-07
      • 2019-08-01
      相关资源
      最近更新 更多