所以我是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');
};
答案 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');
};
这将记录Before
,Promise executor
,After
,然后在五秒后Promise callback
。
答案 1 :(得分:1)
你的listPromise
函数不是真正的异步函数,只返回promise。
使用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();
&#13;