下面是一些我寫在谷歌I/O「賤賣!」持續部署演示(代碼警告:這是在打字稿,沒有JavaScript的。這讓我使用的await /異步哪一個更容易閱讀,尤其是在我的雲功能的代碼,我可以做類似下面的錯誤處理的情況下)
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
let tempy = require('tempy'); // No .d.ts
function rmFileAsync(file: string) {
return new Promise((resolve, reject) => {
fs.unlink(file, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
})
})
}
function statAsync(file: string): Promise<fs.Stats> {
return new Promise((resolve, reject) => {
fs.stat(file, (err, stat) => {
if (err) {
reject(err);
} else {
resolve(stat);
}
})
})
}
async function rmrfAsync(dir: string) {
// Note: I should have written this to be async too
let files = fs.readdirSync(dir);
return Promise.all(_.map(files, async (file) => {
file = path.join(dir, file);
let stat = await statAsync(file);
if (stat.isFile()) {
return rmFileAsync(file);
}
return rmrfAsync(file);
}));
}
然後:
export let myFunction = functions.myTrigger.onEvent(async event => {
// If I want to be extra aggressive to handle any timeouts/failures and
// clean up before execution:
try {
await rmrfAsync(os.tmpdir());
} catch (err) {
console.log('Failed to clean temp directory. Deploy may fail.', err);
}
// In an async function we can use try/finally to ensure code runs
// without changing the error status of the function.
try {
// Gets a new directory under /tmp so we're guaranteed to have a
// clean slate.
let dir = tempy.directory();
// ... do stuff ...
} finally {
await rmrfAsync(dir);
}
}
'fs.rmdir'返回一個承諾?我如何在現有的代碼中使用它? –
另外,我可以訪問或查看我的臨時目錄嗎? –
os.tmpdir是一個普通的目錄。您可以根據需要閱讀或刪除它。如果你不想處理異步,你可以調用'fs.rmdirSync'。否則,有一些簡單的技巧就像我在下面用來將舊的回調API轉換爲Promise API。 –