使用 promises 增量加载图像

Incremental loading of images with promises

我正在尝试加载相同的图像但分辨率不同,一张一张地加载,首先是 1.png,然后是 2.png,然后是 3.png,在 promises 的帮助下,但是当我 运行 代码,它只加载 3.png 图片,我做错了什么?

function loadi(srce){
        if(srce!='3.png'){
        $img1.attr('src',srce).on('load',function(){

            return loadImag();
        });
        }
        else{
            $img1.attr('src',srce).on('load',function(){
                console.log("Load successful");
            });
        }
    }
    function loadImag(){
        return new Promise(function(fulfill,reject){
            fulfill();
        }); 
    }
    loadImag()
            .then(loadi('1.png'),null)
            .then(loadi('2.png'),null)
            .then(loadi('3.png'),null);

第一个建议后的新代码,仍然面临同样的问题,只有一张图片被加载,如 chrome 开发工具中所见

function loadi(srce){

            return loadImage(srce);

    }

    function loadImage(src) {
        return new Promise(function(resolve, reject) {
            $img1.attr('src',src).on('load',function(error){

                     resolve(); 
            });
// Run image loading logic here
// Call resolve() when loading complete, or reject() when fails.
        });
    }

    loadImage('1.png')
            .then(loadi('2.png'))
            .then(loadi('3.png'))
            .then(function() { 
                console.log('Load successful!'); 
            }) // Not in loadImage().
            .catch(function(err) { 
                        console.log("Error");/* Handle potential errors */
});

您的代码有一些问题:

  • loadi 不是 return Promise。从回调中返回未按预期工作。
  • loadImag基本可以换成Promise.resolve().
  • .then() 需要一个函数,您正在传递函数的结果。

您的代码应如下所示:

function loadImage(src) {
  return new Promise(function(resolve, reject) {
    // Run image loading logic here
    // Call resolve() when loading complete, or reject() when fails.
  )};
}

loadImage('1.png')
  .then(function() { return loadImage('2.png'); })
  .then(function() { return loadImage('3.png'); })
  .then(function() { console.log('Load successful!'); }) // Not in loadImage().
  .catch(function(err) { /* Handle potential errors */ });