我有這個函式bd()應該回傳檔案中讀取的所有資料的陣列,這些資料groupes.csv將在以后處理:
function bd() {
const birthdays = [];
fs.createReadStream('./data/groupes.csv')
.pipe(csv({}))
.on('data', (data) => birthdays.push(data))
.on('end', () => {
console.log(birthdays)
});
}
控制臺確實顯示了生日陣列,我的問題是回傳它。
我希望這個函式回傳生日陣列。我沒有成功。
當我將 return 陳述句放在 .on('end') 塊內時,它不起作用(出于某種原因)[也許 return 陳述句應該在 fs.read 之外],如果我這樣做了(把它放在 . on('end') 塊),即使使用 while 回圈等待它完成,陣列似乎也是空的。
uj5u.com熱心網友回復:
我鏈接了舊帖子,但您似乎沒有理解代碼的潛在問題。
.on() 函式用于告訴程式在呼叫evet 時呼叫其中的函式,在本例中為 end,那么我們如何將其應用于您撰寫的代碼?
您的函式在.on('end', () => {});完成讀取后立即被呼叫,因此在呼叫此回呼時將填充您的生日陣列。
這將導致代碼能夠繼續運行,即使流尚未完成,并且當它將您的生日陣列列印到控制臺時,生日陣列尚未開始填充。
那么我們如何解決這個問題呢? 很簡單:我們使用所謂的承諾。
承諾就是你認為的那樣。這是一個承諾,這個函式稍后會回傳一些東西,并承諾在資料可用時提供該資料。
下面是使用 Promise 時函式的外觀示例:
function bd() {
return new Promise((resolve, reject) => {
const birthdays = [];
fs.createRedStream('./data/groupes.csv')
.pipe(csv({}))
.on('data', (data) => birthdays.push(data))
.on('end', () => {
resolve(birthdays);
});
});
}
那么這里到底發生了什么?
我們創建了一個新的 Promise 物件并向其中傳遞了一個新的回呼引數,其中包含我們函式的原始代碼,并從回呼中獲取 2 個引數。這 2 個函式是我們用于錯誤處理 ( .catch()) 和實作我們回傳資料或決議函式的承諾。
這個決議函式基本上是我們使用的,而不是回傳。
那么我們如何在后面的代碼中使用 Promise 呢?
我們使用 .then() 函式,只要 promise 被解決,它就會被呼叫。
bd().then((birthdays) => {
/* Code */
});
如果您不了解 Promise 作業原理的核心概念,那么我可以向您保證(雙關語)js 可能會成為您的問題。我建議您不要只使用提供的代碼,而是嘗試了解它是如何作業的。
你可以閱讀更多關于 Promise 如何在MDN上作業的內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471461.html
