我一直在研究并试图了解异步javascript。经过大量阅读并提出了建议,因为我使用的是IE11,因此建议使用bluebird库,然后在创建的一个简单示例中进行了尝试,但该示例无法正常工作。我在每个函数中添加了一个settimeout来模拟异步性。目标是填充数组,以便我可以console.log()数组值,但无济于事。在我的promise.all
中,我调用createNavigation(),这表明我的所有数组都已填充,但没有填充。同样,将为promise.all
中的结果返回数字。我在做什么错或误解?为什么我的阵列作为空白记录到控制台?
var cacheNavData = [];
var cacheSubNavData = [];
var cacheMegaMenuData = [];
var cacheCategoryMenuData = [];
getNavData();
getSubNavData();
getMegaMenuData();
getCategoryMenuData();
var promises = [
getNavData(),getSubNavData(),getMegaMenuData(),getCategoryMenuData()
]
Promise.all(promises)
.then(function(results){
console.log(results)
createNavigation()
})
function getNavData(){
return setTimeout(function(){
cacheNavData[0] = "Soup";
cacheNavData[1] = "Sandwich";
cacheNavData[2] = "Rice";
}, 3000);
}
function getSubNavData(){
return setTimeout(function(){
cacheSubNavData[0] = "Apple";
cacheSubNavData[1] = "Beans";
cacheSubNavData[2] = "Carrot";
}, 3000);
}
function getMegaMenuData(){
return setTimeout(function(){
cacheMegaMenuData[0] = "Donkey";
cacheMegaMenuData[1] = "Eagle";
cacheMegaMenuData[2] = "Frog";
}, 3000);
}
function getCategoryMenuData(){
return setTimeout(function(){
cacheCategoryMenuData[0] = "Grapes";
cacheCategoryMenuData[1] = "Hand";
cacheCategoryMenuData[2] = "Igloo";
}, 3000);
}
function createNavigation(){
console.log("All arrays have been populated. Let's build the navigation.")
}
console.log(cacheNavData);
console.log(cacheSubNavData);
console.log(cacheMegaMenuData);
console.log(cacheCategoryMenuData);
这是因为在您的函数中,您正在返回计时器的ID,而不是返回在计时器用尽时会解决的承诺。因此,执行几乎是立即的。您要确保在方法中返回承诺而不是计时器ID。这是一个例子:
function getNavData(){
return new Promise(function(resolve) {
setTimeout(function(){
cacheNavData[0] = "Soup";
cacheNavData[1] = "Sandwich";
cacheNavData[2] = "Rice";
resolve();
}, 3000);
});
}
[如果您希望诺言返回数据,则不要使用resolve()
,而是将要解析的数据作为第一个参数传递,例如resolve(cacheNavData)
。
请参阅概念验证示例:
var cacheNavData = [];
var cacheSubNavData = [];
var cacheMegaMenuData = [];
var cacheCategoryMenuData = [];
getNavData();
getSubNavData();
getMegaMenuData();
getCategoryMenuData();
var promises = [
getNavData(),getSubNavData(),getMegaMenuData(),getCategoryMenuData()
]
Promise.all(promises)
.then(function(results){
console.log(results)
createNavigation();
})
function getNavData(){
return new Promise(function(resolve) {
setTimeout(function(){
cacheNavData[0] = "Soup";
cacheNavData[1] = "Sandwich";
cacheNavData[2] = "Rice";
resolve(cacheNavData);
}, 3000);
});
}
function getSubNavData(){
return new Promise(function(resolve) {
setTimeout(function(){
cacheSubNavData[0] = "Apple";
cacheSubNavData[1] = "Beans";
cacheSubNavData[2] = "Carrot";
resolve(cacheSubNavData);
}, 3000);
});
}
function getMegaMenuData(){
return new Promise(function(resolve) {
setTimeout(function(){
cacheMegaMenuData[0] = "Donkey";
cacheMegaMenuData[1] = "Eagle";
cacheMegaMenuData[2] = "Frog";
resolve(cacheMegaMenuData);
}, 3000);
});
}
function getCategoryMenuData(){
return new Promise(function(resolve) {
setTimeout(function(){
cacheCategoryMenuData[0] = "Grapes";
cacheCategoryMenuData[1] = "Hand";
cacheCategoryMenuData[2] = "Igloo";
resolve(cacheCategoryMenuData);
}, 3000);
});
}
function createNavigation(){
console.log("All arrays have been populated. Let's build the navigation.")
}
console.log(cacheNavData);
console.log(cacheSubNavData);
console.log(cacheMegaMenuData);
console.log(cacheCategoryMenuData);