問題:
我正在嘗試按特定順序執行一系列功能。這些函式內部都有異步任務;但是,這些功能需要按順序進行。
以下代碼需要執行以下操作:
洗掉檔案目錄的當前內容(這是因為所有檔案都是持久的,但我不需要它們來永久存盤,只是臨時的)
將當前檔案資產從其位置復制到檔案目錄
壓縮檔案目錄的檔案夾,以便我可以將壓縮后的檔案夾存盤在 AWS 中
是否可以確保這些函式等待它們的異步任務完成?(其中一些異步任務forEach回圈運行——這不是每個函式中的單個任務)。
為了更進一步,我可以copyFilesToDocumentDirectory()同時執行兩個 (x2) 并在執行前等待zipDocumentDirectory()嗎?
import React, { Component } from 'react';
import { zip } from 'react-native-zip-archive';
import RNFS from 'react-native-fs';
export default class AddMedia extends React.Component {
state = {
photoAssets: [],
videoAssets: [],
videoThumbnails: [],
thumbnailReady: false
};
zipDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
console.log("Zipped");
zip(path, path "/urls.zip")
.then((path) => {
console.log("Zip complete");
})
.catch((err) => {
console.log(err);
});
};
deleteContentsOfDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
var data = RNFS.readDir(path)
.then((results) => {
results.forEach(result => {
/* I assume each item here is a FILE */
RNFS.unlink(result.path)
.then(() => {
console.log("File Deleted");
})
.catch((err) => {
console.log(err.message);
});
});
});
};
copyFilesToDocumentDirectory(assets) {
var path = RNFS.DocumentDirectoryPath;
assets.forEach(asset => {
RNFS.exists(asset.uri)
.then((status) => {
if(status) {
var newPath = path "/" asset.fileName;;
console.log("Copying from: ", asset.uri, " -- to: ", newPath);
RNFS.copyFile(asset.uri, newPath);
};
});
});
};
storeToAWS()
this.deleteContentsOfDocumentDirectory();
this.copyFilesToDocumentDirectory(this.state.photoAssets);
this.copyFilesToDocumentDirectory(this.state.videoAssets);
this.zipDocumentDirectory();
};
// ... Render code etc;
};
努力:
我寫了上面的內容,因為那是我要解決的問題。我認為這可以通過Promises 來解決,但我對 promises/async/await 的想法相對較新。我嘗試Promise在每個方法中添加 s 以等待它們完成;但是,函式仍然同步運行,異步任務在后面運行。輸出低于顯示Zipped內部輸出zipDocumentDirectory()發生在內部異步命令之前的代碼copyFilesToDocumentDirectory()。
import React, { Component } from 'react';
import { zip } from 'react-native-zip-archive';
import RNFS from 'react-native-fs';
export default class AddMedia extends React.Component {
state = {
photoAssets: [],
videoAssets: [],
videoThumbnails: [],
thumbnailReady: false
};
zipDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
console.log("Zipped");
new Promise((resolve, reject) => {
zip(path, path "/urls.zip")
.then((path) => {
console.log("Zip complete");
resolve();
})
.catch((err) => {
console.log(err);
reject();
});
});
};
deleteContentsOfDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
new Promise((resolve, reject) => {
var data = RNFS.readDir(path)
.then((results) => {
results.forEach(result => {
/* I assume each item here is a FILE */
RNFS.unlink(result.path)
.then(() => {
console.log("File Deleted");
resolve();
})
.catch((err) => {
console.log(err.message);
reject();
});
});
});
});
};
copyFilesToDocumentDirectory(assets) {
var path = RNFS.DocumentDirectoryPath;
assets.forEach(asset => {
new Promise((resolve, reject) => {
RNFS.exists(asset.uri)
.then((status) => {
if(status) {
var newPath = path "/" asset.fileName;;
console.log("Copying from: ", asset.uri, " -- to: ", newPath);
RNFS.copyFile(asset.uri, newPath);
resolve();
};
});
});
});
};
storeToAWS = async () => {
await this.deleteContentsOfDocumentDirectory();
await this.copyFilesToDocumentDirectory(this.state.photoAssets);
await this.copyFilesToDocumentDirectory(this.state.videoAssets);
// 2. Zip temporary folder storage (with encryption)
await this.zipDocumentDirectory();
OUTPUT:
LOG Zipped
LOG Copying from: XYZ/FEB964FB-3ABB-4CF7-A3B0-1E90BD1932C4.jpg -- to: XYZ/FEB964FB-3ABB-4CF7-A3B0-1E90BD1932C4.jpg
uj5u.com熱心網友回復:
我添加了缺失的退貨。我希望它現在可以作業
import React, { Component } from 'react';
import { zip } from 'react-native-zip-archive';
import RNFS from 'react-native-fs';
export default class AddMedia extends React.Component {
state = {
photoAssets: [],
videoAssets: [],
videoThumbnails: [],
thumbnailReady: false
};
zipDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
console.log("Zipped");
return zip(path, path "/urls.zip")
.then((path) => {
console.log("Zip complete");
})
.catch((err) => {
console.log(err);
reject();
});
};
deleteContentsOfDocumentDirectory() {
var path = RNFS.DocumentDirectoryPath;
return RNFS.readDir(path)
.then((results) => {
return Promise.all(results.map(result => {
return RNFS.unlink(result.path)
.then(() => {
console.log("File Deleted");
})
.catch((err) => {
console.log(err.message);
});
}));
});
};
copyFilesToDocumentDirectory(assets) {
var path = RNFS.DocumentDirectoryPath;
return Promise.all(assets.map(asset => {
return RNFS.exists(asset.uri)
.then((status) => {
if(status) {
var newPath = path "/" asset.fileName;;
return RNFS.copyFile(asset.uri, newPath);
};
});
});
}));
};
storeToAWS = async () => {
await this.deleteContentsOfDocumentDirectory();
await this.copyFilesToDocumentDirectory(this.state.photoAssets);
await this.copyFilesToDocumentDirectory(this.state.videoAssets);
// 2. Zip temporary folder storage (with encryption)
await this.zipDocumentDirectory();
}
}
```
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517863.html
