完全处理另一个函数后执行一个函数

时间:2017-02-05 21:42:45

标签: jquery function asynchronous

我希望你能帮助我......我想完全做到,四年前孩子在下面的贡献中问过jquery, how to run a function as soon as another function ends 。我知道这个问题早已解决了。我在这里找到了解决方案,经过长时间的探索如何处理以及现在是一大堆挫折之后,除了再次打开这个话题之外,我无能为力。所以这就是我想做的事情:

基本上我想要在单击元素(参考框)时定义要切入和/或切出的内容的行为。我有两个功能:

1.function' removeRefContent'

用于检查是否打开了其他引用的内容而不是单击的内容,如果是,则关闭

function: 'appendRefContent2EndOfLine'

只需添加点击的引用框的内容并显示它。

以下是基本代码段:

function displayRefContent(clickedRefID){

// check, if element is opened already      
if ( $( 'div#' + clickedRefID + '_refAdditionalContent' ).length )) {
      removeRefContent();           
} else {

    // check whether other element is opened and close              
    removeRefContent().then( appendRefContent2EndOfLine ( clickedRefID ) ); 

}

}

//这两个功能落后于

function appendRefContent2EndOfLine(requestedRefID){

// get refContent from reference storage container

var refContent = '<div id="' + requestedRefID + '_refAdditionalContent" class="refAdditionalContent">';
    refContent = refContent + $( 'div#' + requestedRefID + '_additionalContentStorageContainer' ).html();
refContent = refContent + '</div>'; 

// find last refPreviewImage in elements row and store in variable lastElementInRowID           
var lastElementInRowID = 0;     //... some more code to find lastElementInRowID ...

// add refContent after last element in row and toggle in

$( 'div#' + lastElementInRowID + '_ref' ).after( refContent );  
$( 'div#' + requestedRefID + '_refAdditionalContent' ).slideToggle( 500 );

}

var removeRefContent = function(){

var removeRefContentDeferred = $.Deferred();

$( 'div.refAdditionalContent' ).slideToggle( 500 , function() {         
    $( 'div.refAdditionalContent' ).remove( function() {
        removeRefContentDeferred.resolve();
    });     
});     

return removeRefContentDeferred.promise();      

}

这两个功能都符合他们的意图。行的问题,行

removeRefContent()。then(appendRefContent2EndOfLine(clickedRefID));

请求

。我想首先删除所有其他引用的内容(通过切换),并且只有在完成并且$(&#39; div.refAdditionalContent&#39;).remove完成后,才能执行appendRefContent2EndOfLine的另一个函数。 / p>

我阅读了很多关于异步,排队和序列的内容,但根本不明白,为什么我的解决方案不起作用。结果是,两个函数同时执行,导致冲突。

到目前为止,我认为在许多其他解决方案方法中,我选择的是最优雅的解决方案。但我非常愿意了解你的想法......

谢谢你们!

干杯弗兰克

1 个答案:

答案 0 :(得分:0)

再次,更新的代码:

控制显示和隐藏元素内容的功能:

function displayRefContent ( clickedRefID ) {           
    if ( $( 'div#' + clickedRefID + '_refAdditionalContent' ).length ) { // check, if element is opened already, if yes then close only         
        removeRefContent();         
    } else {                        
        if ( $( 'div.refAdditionalContent' ).length ) {      // check whether other element is opened and close first, before open another element                      
            removeRefContent().then( appendRefContent2EndOfLine ( clickedRefID ) );                     
        } else {            
            appendRefContent2EndOfLine ( clickedRefID ); // if no other content element is opened, only open element                
        }           
    }               
}   

并且AT FIRST的两个函数淡出并删除对象,AFTERWARDS追加并淡入新对象

var removeRefContent = function () {            
    var defRemoveContent = $.Deferred();        
    $( 'div.refAdditionalContent' ).slideToggle( 500 , function()       
        $( 'div.refAdditionalContent' ).remove();
        defRemoveContent.resolve();
    });                             
    return defRemoveContent.promise();      
}

function appendRefContent2EndOfLine ( requestedRefID ) {            

    // get refContent from reference storage container (could be more elegant, but not relevant here)
    var refContent = '<div id="' + requestedRefID + '_refAdditionalContent" class="refAdditionalContent">';
        refContent = refContent + $( 'div#' + requestedRefID + '_additionalContentStorageContainer' ).html();
    refContent = refContent + '</div>'; 

    var lastElementInRowID = ...;    // some code to find last refPreviewImage in elements row and store in variable lastElementInRowID 

    // add refContent after last element in row and toggle in       
    $( 'div#' + lastElementInRowID + '_ref' ).after( refContent );  
    $( 'div#' + requestedRefID + '_refAdditionalContent' ).slideToggle( 500 );      

}

问题出在displayRefContent的情况下,其中已经打开了内容,需要先关闭然后再打开新内容。它同时执行,所以我不能影响顺序和时间(函数removeRefContent完成后函数appendRefContent2EndOfLine)。

感觉就像世界上最血腥的初学者,感到沮丧,没有更多的想法可以追随。还检查了,如果功能受到其他事情的影响,例如文档未完全加载事实,则在document.ready()之后加载内容。看不出任何影响。

谢谢,希望有人愿意帮忙 弗兰克