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