2016-09-27 130 views
1

我是next(),done()等的新手,並且在串行執行之間傳播參數/可能是異步函數的鏈接。如何將參數傳遞給下一個函數done()或next()

我想強制的2個功能串行執行,以便他們能夠像或者叫做:

f1('#{arg1a}', '#{arg1b}').done(
    f2('#{arg2a}', '#{arg2b}') 
); 

或類似的東西:

f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2); 

凡ARG值從被收集傳遞使用JSF查詢參數。

需要注意的是:

  • arg2aarg2b是在我的情況完全無關的arg1aarg1b,以及f2調用不依賴於在f1會發生什麼的任何方式,除了必須執行嚴格來說,即使f1通常是異步的。

  • 我沒有定義即時匿名函數或內部完成()這裏(還),我想能夠調用一些已知的參數庫定義的函數。

在這個例子中,該功能會是這樣的:

function f1(arg1a, arg1b) { 

    //do something with arg1a, arg1b 

    return $.Deferred().resolve(); 
} 

function f2(arg2a, arg2b) { 
    // Do something with arg2a and arg2b AFTER f1 has fully run. 
} 

或類似的東西:

function f1(arg1a, arg1b, arg2a, arg2b) { 

    //do something with arg1a, arg1b 

    // Somehow ensure f1 is finished then execute f2(arg2a, arg2b) 
} 

function f2(arg2a, arg2b) { 
    // Do something with arg2a and arg2b AFTER f1 has fully run. 
} 

只需使用回調鏈接爲我解決的情況沒有工作。另請參見:How link to and target/open a p:tab within an p:accordionPanel within a p:tab within a p:tabview

一個可以接受的答案必須允許我有一個預先定義的函數f2與預先定義的參數

+0

'return $ .Deferred()。resolve()'沒有任何意義,因爲你在同一時間調用解析,在這種情況下你甚至不需要處理這個異步。你在'f1'裏面使用異步函數嗎? – slebetman

+0

另外,你可以給你一個**同步**的例子,你正在嘗試做什麼。 「如果這是同步的,我想這麼做...」 – slebetman

回答

1

你需要傳遞參數給.resolve(),然後用.then()

function f1(arg1a, arg1b) { 

    return $.Deferred(function(dfd) { 
    //do something with arg1a, arg1b 
    // you can alternatively call `.resolve()` without passing parameters 
    // when you are finished doing something with `arg1a`, `arg1b`, 
    // which should call chained `.then()` where `f2` is called 
    dfd.resolve(arg1a, arg1b) 
    }).promise(); 
} 

function f2(arg2a, arg2b) { 
    // Do something with arg2a and arg2b AFTER f1 has fully run. 
} 

f1(arg1, arg2) 
.then(function() { 
    // call `f2` here 
    f2('#{arg2a}', '#{arg2b}'); 
}) 
// handle errors 
.catch(function(err) { // alternatively use `.fail()` 
    console.log(err) 
}); 

jsfiddle https://jsfiddle.net/wuy8pj8d/

+0

我不明白你是如何通過arg2a和arg2b(最終由'f2處理的)實際值爲' f1(arg1,arg2).then(f2)...' –

+0

_「我不明白你是如何通過arg2a和arg2b的實際值」_你是什麼意思?你可以將你需要的任何值傳遞給'.resolve()' – guest271314

+0

'arg2a'和'arg2b'在我的情況下與'arg1a'和'arg1b'完全無關。當你調用'f1(arg1a,arg1b).then(f2)...'時,沒有時刻從arg2a,arg2b的JSF參數中搜集到的值被注入。它們甚至不會出現在您的調用/調用代碼中。 –

1

除了忘記包裝要執行的代碼外,您幾乎已經明白了在函數內部的未來時(done最終調用):

f1('#{arg1a}', '#{arg1b}').done(function(){ 
    f2('#{arg2a}', '#{arg2b}') 
}); 

這也適用於常規的回調。例如,假設您已經定義f1接受的回調,而不是一個承諾,你會然後做:

f1('#{arg1a}', '#{arg1b}',function(){ 
    f2('#{arg2a}', '#{arg2b}') 
}); 

這裏沒有什麼特別。沒有強制回調接受自定義參數的單獨語法,只是將其包裝在另一個函數中。

這也適用於由於變量關閉:

var a='#{arg1a}', b='#{arg1b}'; 
var c='#{arg2a}', d='#{arg2b}'; 

f1(a,b).done(function(){ 
    f2(c,d) 
}); 

變量cd將在done()訪問。

+0

感謝您的替代答案,它肯定(如來自@ guest271314的修訂後的已接受答案)使得'f2'的值可用。然而,正如'下一個('和''回調'方法,在我的[涉及Primefaces web應用程序的真正問題](http://stackoverflow.com/questions/39716981/how-link-to-and-target-open -a-ptab-within-an-paccordionpanel-within-a-ptab-wi),'done('在'f2'在'f1'結束前運行',因此某些選擇器失敗(因爲它們還沒有可用但是這超出了這個問題的範圍 –

+0

@ Webelitaustralia-upvoter:這個問題的問題是,在你等待的任何事情完成之前你調用了'callback',因此它沒有工作,回調的目的是讓你可以將它傳遞給你正在等待的東西,如果這件事不能提供回調或承諾,那麼你必須訴諸使用'setTimeout'來輪詢DOM並等待直到你等待的東西存在。 – slebetman

相關問題