2017-07-05 22 views
0

私はある順序で起こる必要のある半複雑な約束を持っています。プロミスチェーンの一部である関数の1つは、別の関数から解決される前に約束を返すことです。例:Jquery。関数が終了するのを待たずに

this.triOverlay = new Image(); 
this.triOverlayFinal = new Image(); 

//Start the promise chain for overlay stuff 
$.when($.loadImage(this.triOverlay, 'art/small.png'), this.loadAgentImages()).then(function() { 
    console.log(">>> ALL DONE!!!! <<<<"); 
}); 

LoadImageは、繰延オブジェクトを構築し、画像の読み込みと処理のためにそれを設定し、単純なjQueryの関数である:それは複雑になる

$.loadImage = function (image, url) { 
    // Define a "worker" function that should eventually resolve or reject the deferred object. 
    var loadImage = function (deferred) { 

     image.onload = loaded; 
     image.onerror = errored; // URL returns 404, etc 
     image.onabort = errored; // IE may call this if user clicks "Stop" 

     image.src = url; 

     function loaded() { 
      unbindEvents(); 
      console.log(">>>>> resolved image! URL: "); 
      deferred.resolve(image); 
     } 
     function errored() { 
      unbindEvents(); 
      deferred.reject(image); 
     } 
     function unbindEvents() { 
      // Ensures the event callbacks only get called once. 
      image.onload = null; 
      image.onerror = null; 
      image.onabort = null; 
     } 
    }; 
    return $.Deferred(loadImage).promise(); 
}; 

はloadAgentImagesに、私は別のセットを持っているということです

CubePan.prototype.loadAgentImages = function() { 

    var largePhotoPath = 'someURL'; //Just an example 
    var smallPhotoPath = 'someURL2'; //Just an example 

    //This cubePan 
    var me = this; 

    return $.when($.loadImage(this.agent.photo, smallPhotoPath), $.loadImage(this.agent.blurAgentPhoto, largePhotoPath)).then(function() { 
     //return deferred.promise(); 
     console.log(">>>> before start on bluid blur and build TriOverlay <<<<"); 
     return buildBlur(me); 
     //return blur; 
    }, function() { console.log(">>>> blur rejected <<<<"); }); 
}; 

元画像とCAL:それらがロードされた後に発生する必要があります句でロードする必要がある画像のlからloadAgentImagesは同じオブジェクトにあります。私は私が上記を含んでいなかったことを知っている。

を正しく発射し、それはbuildBlur(私を)呼び出すときに、2枚の画像がで解決されたら:

function buildBlur(me) { 
    console.log(">>>> buildBlur <<<<"); 
    var blurCanvas = document.createElement('canvas'); 
    var blurCTX = blurCanvas.getContext('2d'); 
    blurCanvas.height = me.agent.blurAgentPhoto.height; 
    blurCanvas.width = me.agent.blurAgentPhoto.width; 
    blurCTX.drawImage(me.agent.blurAgentPhoto, 0, 0, blurCanvas.width, blurCanvas.height); 

    //This function can be found in stackBlur.js 
    boxBlurCanvasRGBA(blurCanvas, 0, 0, blurCanvas.width, blurCanvas.height, 20); 
    return $.loadImage(me.agent.blurAgentPhotoFinal, blurCanvas.toDataURL('image/png', 1.0)); 

}; 

その、その、それを返す解決されたらしかし、BuildBlurは約束を返しません。直ちに。最終的な画像(blurAgentPhotoFinal)がまだ読み込まれずに解決されているにもかかわらず、チェーンの残りの部分を解決すると思っています。

$ .loadImageは、上記のすべてのインスタンスで機能しますが、buildBlurを使用するインスタンスでは機能しません。

チェーンを完全に解決する前にbuildBlurの$ .loadImageが終了するのを待っている理由は何ですか?

ありがとうございます!

答えて

0

問題が見つかりました。コードはjqueryの非常に古いバージョンを使用していました。 1.7。最新の状態にアップグレードすると、正しく動作するようになりました。

関連する問題