【问题标题】:Is there a good way to ensure an object gets created before moving through code that uses it?有没有一种好方法可以确保在移动使用它的代码之前创建一个对象?
【发布时间】:2019-06-26 06:52:10
【问题描述】:

我有一段代码使用 fetch() 来抓取 .tiff 图像并将其转换为 html5 画布,以便使用 tiff.js 在浏览器中显示( https://github.com/seikichi/tiff.js/tree/master)。它几乎工作得很好,但是,我注意到有时图像无法进入浏览器。

会出现一些图像,但偶尔会出现其他图像,并在浏览器中显示以下错误消息:

ReferenceError: Tiff is not defined

我需要找出是否有确保成功创建这些对象的好方法,如果我能深入了解导致这种行为的原因,我将不胜感激。

class tiffImage {
    constructor() {
        this.tiffURL = 'url-to-image';
        this.height;
        this.width;
        this.canvas;
    }

    async loadImage() {
        fetch(this.tiffURL)
            // retrieve tiff and convert it to an html5 canvas
            let response = await fetch(this.tiffURL);
            let buffer = await response.arrayBuffer();
            let tiff = new Tiff({buffer: buffer});  // error points to this line
            this.canvas = tiff.toCanvas();

            /* Parse some data from image and do DOM stuff */

    }

}

// retrieve and display boards
let someTiff1 = new tiffImage();
let someTiff2 = new tiffImage();
let someTiff3 = new tiffImage();
let someTiff4 = new tiffImage();
let someTiff5 = new tiffImage();

someTiff1.loadImage();
someTiff2.loadImage();
someTiff3.loadImage();
someTiff4.loadImage();
someTiff5.loadImage();

有时可能会加载所有图像,有时则不会。如果页面刷新足够多次,则可以保证看到某些图像无法加载。请注意,在我的实际项目中,我在 13 个对象上实例化并调用 loadImage()

【问题讨论】:

  • 是的:使用fetch()返回的Promise。
  • 为什么你有fetch(this.tiffURL),然后是let response = await fetch(this.tiffURL);?此外,错误似乎指向在fetch 返回之前未加载此“tiff.js”,这似乎很奇怪。您可能想查看相对于您对 loadImage 的调用加载该库的位置...
  • @Pointy 如果您对自己的评论有信心,您能详细说明一下吗?据我所知,问题不在于fetch() 调用,而在于Tiff() 对象的实例化。
  • @Heritic Monkey 不错的收获!我减少了代码以发布示例,但仍然没有发现该错误。删除第一个 fetch() 调用后,页面要么加载所有图像,要么不加载任何图像,而不是只加载一些图像,这很有趣。
  • @Heritic Money 看来我正在加载 tiff.js tiff.min.js包含上述代码示例的文件。重新排序似乎已经纠正了这个问题。我需要看到它运行一段时间才能真正测试它,但它看起来很有希望。如果您愿意将您的建议作为答案发布,我会接受,谢谢!

标签: javascript ajax asynchronous fetch


【解决方案1】:

阅读Promises。承诺将允许您等待异步操作完成后再继续。

loadImage() {
    return fetch(this.tiffURL)
        .then(response=>{
        // retrieve tiff and convert it to an html5 canvas
        let buffer = response.arrayBuffer();
        let tiff = new Tiff({buffer: buffer});  // error points to this line
        this.canvas = tiff.toCanvas();
        return this;

        /* Parse some data from image and do DOM stuff */
    }
}

Promise.all([someTiff1.loadImage(),someTiff2.loadImage()])
.then(results=>{
    console.log("My results", results)
})

不要在您的代码中使用asyncawait。如果你使用这些,那么你使用的 Promises 是错误的。

【讨论】:

  • 感谢您的回复。我很欣赏这个代码示例,并将实施您的建议。但是我想指出,这个答案是题外话,因为这个特定问题的解决方案是我加载脚本的顺序,这是@Heritic Monkey 建议的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多