Я использую отличную библиотеку exifr для чтения даты создания из png. Я перебираю массив и добавляю данные к созданному маркеру на карте... но я застрял на обещаниях!
Это то, что я хочу делать в каждой итерации цикла.
exifr.parse(bottlefullurl, {xmp: true, tiff:false})
.then(output => bottledate = output.CreateDate);
jmarker.jmarkerdatedata = bottledate;
Что, конечно же, возвращает undefined, поскольку обещание не завершено. Я могу записать это в консоль, чтобы знать, что библиотека работает.
exifr.parse(bottlefullurl, {xmp: true, tiff:false})
.then(output => console.info(output.CreateDate));
Документация отличная, но все примеры только console.info
https://github.com/MikeKovarik/exifr/blob/master/README.md
Я прочитал несколько отличных ответов о переполнении стека, таких как этот ...
Как вернуть ответ при асинхронном вызове?
... и некоторые статьи и документы MDN, но это примерно на три шага впереди моего текущего понимания Javascript (я не могу писать стрелочные функции).
Пожалуйста помоги!
Bottledate не находится в области действия, где вы его назначаете, он находится в области действия созданной вами функции стрелки.
попробуй это:
jmarker.jmarkerdatedata = exifr.parse(bottlefullurl, {xmp: true, tiff:false})
.then(output => output.CreateDate);
Оказался на один уровень тупее. Я пытался выполнить ожидание и получил сообщение об ошибке, потому что я добавлял свой файл .js, используя type='text/javascript', а не type=module... поэтому ожидание не сработает! Дох.
Так что это было очень просто после исправления:
jmarker.jmarkerdatedata = await exifr.parse(bottlefullurl, {xmp: true, tiff:false})
.then(output => output.CreateDate);
Кажется, на шаг ближе, возвращено [object Promise] вместо [undefined]. У меня есть функция onClick для каждого из маркеров. Может быть, это будет проще сделать там, но я хотел бы сделать это в цикле.