Javascript 如何加载带有链接承诺的图像

Javascript 如何加载带有链接承诺的图像,javascript,image,promise,Javascript,Image,Promise,我在加载带有链接承诺的脚本的图像时遇到了问题-它们最后没有定义。我也有一个404错误,我不太明白,因为我已经确认了所有的源代码都是有效的,但我承认我仍然是一个在异步上下文中调试的noob这是问题所在。我已经细细琢磨了几天了,可能需要一两次轻推才能让我朝着正确的方向前进。我认为这可能是问题所在: function loadImagePromises() { var imageLoadPromises = []; for ( var i = 0; i < sources.le

我在加载带有链接承诺的脚本的图像时遇到了问题-它们最后没有定义。我也有一个404错误,我不太明白,因为我已经确认了所有的源代码都是有效的,但我承认我仍然是一个在异步上下文中调试的noob这是问题所在。我已经细细琢磨了几天了,可能需要一两次轻推才能让我朝着正确的方向前进。我认为这可能是问题所在:

function loadImagePromises() {
    var imageLoadPromises = [];
    for ( var i  = 0; i < sources.length; i++ ) {
        imageLoadPromises.push( 
            imgLoad( sources[i] ).then(function(response) {
                var myImage = new Image();
                myImage.src = response; // response is a blob
            }, function(Error) {
                console.log("There was an error when the image was loaded after download: " + Error);
            }) );
    }
    console.log( imageLoadPromises );
    return imageLoadPromises;
}
函数loadImagePromissions(){
var ImageLoadPromissions=[];
对于(var i=0;i
作为上下文,我正在为一个Three.js程序编写一个图像加载程序脚本。无需将图像加载到DOM中-稍后我将在WebGL可视化中将其用作纹理

注:
这里有一个较早且更简单的端到端工作并输出到DOM。

这里可能需要考虑其他一些因素,但您的成功处理程序没有显式返回任何内容,因此隐式返回未定义的

function(response) {
  var myImage = new Image();
  myImage.src = response;
  // if you want the promise to resolve to a useful value put
  // it below, with whatever you want e.g:
  return myImage;
}
回复:错误: 您可能不应该在错误处理程序中隐藏
Error
,只需使用小写的
Error
。此外,当使用
console.log/console.error
时,您可以使用
链接消息的部分,这些部分通常比连接时使用的字符串显示更丰富的消息

e、 g

FWIW您还可以通过使用
map
将每个源映射到一个承诺,从而减少一些繁琐的迭代/收集:

function loadImagePromises() {
  return sources.map(function(source) {
    return imgLoad(source).then(function(response) {
    // ...
    });
}
编辑Re:等待实际加载图像对象

return imgLoad(source).then(function(response) {
  var imageURL = window.URL.createObjectURL(response);
  var myImage = new Image();

  return new Promise(function(resolve, reject) {
    myImage.onload = function () {
      // image has loaded
      resolve(myImage);
    }

    // TODO error handling

    myImage.src = imageURL;
  });
}, console.error);
});

这里可能还有一些其他的注意事项,但是您的成功处理程序没有显式返回任何内容,因此它隐式返回
undefined

function(response) {
  var myImage = new Image();
  myImage.src = response;
  // if you want the promise to resolve to a useful value put
  // it below, with whatever you want e.g:
  return myImage;
}
回复:错误: 您可能不应该在错误处理程序中隐藏
Error
,只需使用小写的
Error
。此外,当使用
console.log/console.error
时,您可以使用
链接消息的部分,这些部分通常比连接时使用的字符串显示更丰富的消息

e、 g

FWIW您还可以通过使用
map
将每个源映射到一个承诺,从而减少一些繁琐的迭代/收集:

function loadImagePromises() {
  return sources.map(function(source) {
    return imgLoad(source).then(function(response) {
    // ...
    });
}
编辑Re:等待实际加载图像对象

return imgLoad(source).then(function(response) {
  var imageURL = window.URL.createObjectURL(response);
  var myImage = new Image();

  return new Promise(function(resolve, reject) {
    myImage.onload = function () {
      // image has loaded
      resolve(myImage);
    }

    // TODO error handling

    myImage.src = imageURL;
  });
}, console.error);
});

谢谢你看这个!因此,我在上面函数的末尾返回承诺数组,并将其传递给promises.all。在这种情况下,这仍然是一个成功的问题吗?“这仍然是一个成功的问题吗”不确定你的意思是什么,但是是的,你对
承诺的使用。所有的
看起来都很好。但是你告诉我;当他们都成功回来后,你想做什么?酷。所以我希望是一个由三个加载的图像组成的数组。啊,为了确保你的图像对象确实加载了,你还需要等待它们加载编辑…不确定threejs是否可以接受objectUrl,但这将节省为每个纹理加载图像并确保加载的额外步骤,或者见鬼,如果它可以接受一个blob,那么你甚至不需要为它创建一个objectUrl。谢谢你来看看这个!因此,我在上面函数的末尾返回承诺数组,并将其传递给promises.all。在这种情况下,这仍然是一个成功的问题吗?“这仍然是一个成功的问题吗”不确定你的意思是什么,但是是的,你对
承诺的使用。所有的
看起来都很好。但是你告诉我;当他们都成功回来后,你想做什么?酷。所以我希望是一个由三个加载的图像组成的数组。啊,为了确保你的图像对象确实加载了,你还需要等待它们加载编辑…不确定threejs是否可以接受objectUrl,但这将节省为每个纹理加载图像并确保加载的额外步骤,或者见鬼,如果它可以接受一个blob,那么您甚至不需要为它创建objectUrl