请看这个小提琴。我有一个globalPromiseList数组,用于控制我网站上的页面加载微调器。完成该数组中的所有promise后,删除加载微调器。首先在任何JS之前声明全局列表:
var globalPromiseList = [];
然后我可能在页面上有个别的承诺,我想在spinner隐藏页面时完成。在这里,我创建我的个人承诺,并将它们添加到全球承诺列表中。 注意:我必须设置这样的承诺,因为我正在挂钩来自第三方库的事件,我不能把代码放在包含的promise块中(参见Resolve Javascript Promise outside function scope)。
function someActionDone(id) {
window[id].resolve({
then: function (result) {
console.log(id + " loaded!");
return result;
}
});
};
[
("groups-no-dropdown"),
("groups-default"),
("groups-extended"),
].forEach(function(id) {
window[id] = { resolve: undefined, reject: undefined };
window[id + "loaded"] = new Promise(function(resolve, reject) {
window[id].resolve = resolve;
window[id].reject = reject;
});
globalPromiseList.push(window[id + "loaded"]);
});
$(document).ready(function(){
[("groups-no-dropdown"),
("groups-default"),
("groups-extended"),
].forEach(function(id) {
someActionDone(id);
});
});
然后所有承诺检查以删除微调器:
Promise.all(globalPromiseList).then(function () {
$("#loading-overlay").css("overflow", "unset");
$("div#page.loadingoverlay").animate({
opacity: "toggle"
},
{
duration: 1200,
specialEasing: {
width: "linear"
},
done: function() {
$("div#page.loadingoverlay").toggle(false);
}
});
console.log('all promises finished');
});
但是,尽管在.then
中调用了控制台日志,但我的所有承诺都保持挂起状态。
请看这个例子:https://jsfiddle.net/DOTang/whwqp5nn/
检查控制台,你会看到3条已加载的消息,但承诺仍然未决。
然后我尝试拨打resolve().then()
,而不是在解决呼叫中提供:
window[id].resolve().then(
function (result) {
console.log(id + " loaded!");
return result;
}
);
但这给了我一个错误:
Cannot read property 'then' of undefined
我做错了什么?
编辑感谢评论我能够解决这个问题: https://jsfiddle.net/DOTang/whwqp5nn/1/我的决心/然后使用是错误的。 它应该是这样,添加:
window[id + "loaded"].then(function(id){
console.log(id + " loaded!");
});
然后将comboboxDataBound更改为:
function comboboxDataBound(id) {
window[id].resolve(id);
};