2 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
同步和異步執(zhí)行
如果函數(shù)是同步的,則可以按順序調(diào)用它們,因?yàn)樗鼈兪且粋€(gè)接一個(gè)執(zhí)行的:
getStudentDataFunction() getTeachersDataFunction()
然而,這些函數(shù)大概是異步的,否則你就不會(huì)問這個(gè)問題。這意味著該函數(shù)中的一條語句必須啟動(dòng)獲取數(shù)據(jù)的過程,但它是通過另一程序路徑獲取的。
異步請(qǐng)求示例
一個(gè)例子是XMLHttpRequest
,發(fā)出瀏覽器內(nèi) HTTP 請(qǐng)求的標(biāo)準(zhǔn)方法(該示例來自Mozilla 文檔):
var?oReq?=?new?XMLHttpRequest(); oReq.addEventListener("load",?reqListener); oReq.open("GET",?"http://www.example.org/example.txt"); oReq.send();
這里oReq.send();
發(fā)出HTTP請(qǐng)求,開始請(qǐng)求數(shù)據(jù)的過程。但實(shí)際獲取數(shù)據(jù)的方式是通過使用reqListener
第二行中的回調(diào)函數(shù)。當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí),將使用this
上下文對(duì)象單獨(dú)調(diào)用該函數(shù),該上下文對(duì)象允許獲取 HTTP 響應(yīng)。因此,任何因 HTTP 請(qǐng)求返回而執(zhí)行的代碼都必須從 調(diào)用reqListener
。
適用于您的場(chǎng)景
為了讓您的函數(shù)按順序運(yùn)行,您需要識(shí)別回調(diào)函數(shù)或getStudentDataFunction()
用于獲取其數(shù)據(jù)的其他機(jī)制,然后使用 JavaScript 處理異步代碼的方法之一以您想要的方式對(duì)函數(shù)進(jìn)行排序。三種主要方式是回調(diào)、Promises和異步函數(shù)(從最古老到最現(xiàn)代)。getStudentDataFunction()
本身應(yīng)該使用這三種方法之一。
這些將按如下方式工作:
// 1. If getStudentDataFunction() accepts a callback
var studentCallback = function(studentData) {
? ?getTeachersDataFunction()
}
getStudentDataFunction(studentCallback)
// 2. If getStudentDataFunction() returns a Promise:
getStudentDataFunction()
? ?.then(getTeachersDataFunction) // second function is only called when Promise resolves
// 3. If getStudentDataFunction() returns a Promise and you wish to use async functions:
async function getAllData() {
? ?await getStudentDataFunction() // await keyword makes execution wait for Promise to resolve
? ?getTeachersDataFunction()
}
getAllData()

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可能需要使用 Rxjs 使這兩個(gè)方法可觀察,因此您可以執(zhí)行以下操作:
? caller() {
? ? this.method1()
? ? ? .pipe(switchMap(res1 => this.method2(res1)))
? ? ? .subscribe(res2 => {
? ? ? ? console.log(res2);
? ? ? });
? }
添加回答
舉報(bào)