如何使用快速

时间:2017-08-13 23:50:24

标签: javascript node.js express promise

所以我是Node的新手,我一直在尝试用promises做一些工作。我的问题是我似乎无法让我的端点“异步”执行它的代码。我的想法是我的端点执行'list'功能,该功能应该将单词注销到控制台并将'true'返回给响应。我的所有承诺都是等待五秒钟并打印出“承诺”。我期待控制台打印'之前''之后''承诺'(按顺序),但我得到'之前''承诺''之后',这在我看来是同步执行。 list函数不应该移到代码的最后一行('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');
 };

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你的listPromise函数不是真正的异步函数,只返回promise。 使用setTimeout函数模拟异步操作:

&#13;
&#13;
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();
&#13;
&#13;
&#13;