Я работаю над небольшой 2D-библиотекой игр для собственного использования, и у меня возникла проблема. В библиотеке называется loadGame, которая принимает информацию о зависимостях в качестве входных данных (файлы ресурсов и список скриптов, которые должны быть выполнены). Вот пример.
loadGame({
"root" : "/source/folder/for/game/",
"resources" : {
"soundEffect" : "audio/sound.mp3",
"someImage" : "images/something.png",
"someJSON" : "json/map.json"
},
"scripts" : [
"js/helperScript.js",
"js/mainScript.js"
]
})
Каждый элемент в ресурсах имеет ключ, который используется игрой для доступа к этому конкретному ресурсу. Функция loadGame преобразует ресурсы в объект promises.
Проблема заключается в том, что он пытается использовать promises.all для проверки, когда все они готовы, но Promise.all принимает только итерации в качестве входов - поэтому объект, подобный тому, что у меня есть, не может быть и речи.
Итак, я попытался преобразовать объект в массив, это отлично работает, за исключением того, что каждый ресурс является всего лишь элементом в массиве и не имеет ключа для идентификации.
Здесь код для loadGame:
var loadGame = function (game) {
return new Promise(function (fulfill, reject) {
// the root folder for the game
var root = game.root || '';
// these are the types of files that can be loaded
// getImage, getAudio, and getJSON are defined elsewhere in my code - they return promises
var types = {
jpg : getImage,
png : getImage,
bmp : getImage,
mp3 : getAudio,
ogg : getAudio,
wav : getAudio,
json : getJSON
};
// the object of promises is created using a mapObject function I made
var resources = mapObject(game.resources, function (path) {
// get file extension for the item
var extension = path.match(/(?:\.([^.]+))?$/)[1];
// find the correct 'getter' from types
var get = types[extension];
// get it if that particular getter exists, otherwise, fail
return get ? get(root + path) :
reject(Error('Unknown resource type "' + extension + '".'));
});
// load scripts when they're done
// this is the problem here
// my 'values' function converts the object into an array
// but now they are nameless and can't be properly accessed anymore
Promise.all(values(resources)).then(function (resources) {
// sequentially load scripts
// maybe someday I'll use a generator for this
var load = function (i) {
// load script
getScript(root + game.scripts[i]).then(function () {
// load the next script if there is one
i++;
if (i < game.scripts.length) {
load(i);
} else {
// all done, fulfill the promise that loadGame returned
// this is giving an array back, but it should be returning an object full of resources
fulfill(resources);
}
});
};
// load the first script
load(0);
});
});
};
В идеале я хотел бы каким-то образом правильно управлять списком promises для ресурсов, сохраняя при этом идентификатор для каждого элемента. Любая помощь будет оценена, спасибо.