В этом случае я обнаружил, что новый асинхронный синтаксис javascript легче понять.
Approach
Вы выполняете функцию checkPhrFolder
синхронно, в то время как две другие функции, зависящие от асинхронного вызова API, ожидают разрешения для разрешения, чтобы вернуть значение. Это приведет к тому, что phr будет неопределенным, когда вы оцените его в синхронном checkPhrFolder
выполнении.
В основном, чтобы это работало, вы должны связать разрешение ваших обещаний, чтобы правильно использовать их возвращаемые значения. Новый синтаксис javascript позволяет писать асинхронные функции с меньшим количеством строк кода. С помощью ключевых слов async
и await
вы можете управлять потоком разрешения обещаний и, в основном, ждать, пока асинхронная функция вернется, прежде чем выполнить правильное назначение.
Пример
async function createFolder(name, parent) {
if (!parent) parent = 'root';
var fileMetadata = {
'name': name,
'mimeType': 'application/vnd.google-apps.folder',
'parent': parent
};
const res = await gapi.client.drive.files.create({
'resource': fileMetadata,
'fields': 'id'
});
return res.result['id'];
}
async function getFolder(name, parent) {
if (!parent) parent = 'root';
const res = await gapi.client.drive.files.list({
'pageSize': 1,
'fields': "nextPageToken, files(id, name, mimeType, parents)",
'q': "mimeType='application/vnd.google-apps.folder' \
and '" + parent + "' in parents \
and name = '" + name + "'"
});
return res.result.files.length > 0 ? res.result.files[0]['id'] : null;
}
async function checkPhrFolder() {
var phr = await getFolder('Personal Health Record');
console.log('get folder: '+phr);
if (!phr) {
console.log('creating ...');
phr = createFolder('Personal Health Record');
}
}
В этом Таким образом, ваша функция checPhrFolder
будет читаться почти так же легко, как и раньше. Когда вы будете использовать функцию checkPhrFolder
в синхронном контексте, вы сможете заключить ее возвращаемое значение в тот же оператор then/catch
.
Reference
Async / Await