好像明白了原理,但实际上并不是一帆风顺。
首先.js
const getVisa = require('./second.js');
function queryForVisa() {
console.log('Query processing ...... --------');
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
let allowed = true;
if(allowed) {
console.log('Visa is allowed');
resolve();
} else {
reject('The visa is denied');
}
}, 2000);
});
return promise;
}
queryForVisa()
.then(getVisa) // этот срабатывает правильно, ждет промиса и тогда начинает выполняться
.then(function(data) { //этот не дожидается промиса и выполняется
console.log('last then');
console.log(data);
})
.catch(error => console.log(error));
第二.js
const getVisa = function () {
setTimeout(function() {
console.log('Visa received');
let travel = {};
let visa = {
country: 'USA'
}
travel.visa = visa;
console.log('getVisa.visa', visa);
return Promise.resolve(travel);
}, 2500);
}
module.exports = getVisa;
和响应日志:
Query processing ...... --------
Visa allowed
last then
undefined
Visa received
getVisa.visa { country: 'USA' }
我知道第二个功能有问题,但是什么?也有必要按照queryForVisa的形象做新的Promise吗?我在github和教程上看别人的代码,那里一切都很简单:
function()
.then(function(){...})
.then(function(){...})
并且里面没有新的 Promise,return promise。
我稍微缩短了代码。从模块中提取函数。但这应该不会影响。
您的函数会
getVisa返回undefined,因此then无需等待即可触发后的所有内容。从您传递的函数
then中,您可以返回一个Promise、一个值(同步)或一个异常。延迟是一种异步操作 - 因此您需要返回一个异步值 - 一个Promise。我重做
getVisa了它,一切都按预期工作。