Я пишу код SharePoint, чтобы создать новую папку и загрузить туда несколько файлов. В псевдо-коде C это будет выглядеть так.
String folderName = giveNiceFolderNameBasedOnSomeBusinessLogic();
if (REST_checkfileExists(folderName) {
if (confirmDialog("File already exists. Do you want to delete old folder ?") == true) {
REST_deleteFile(folderName)
} else {
return; // Do not overwrite
}
}
if (REST_createFolder(folderName) == 0) {
REST_uploadFiles( folderName, fileListToUpload);
}
Ниже приведены мои ингредиенты в JavaScript, собранные при поиске в Google. Я подтверждаю, что каждая функция работает в моей среде, но не могу понять, как я могу склеить их, сохраняя при этом возможность повторного использования каждой функции. Я ценю здесь советы экспертов.
Например, я могу жестко запрограммировать следующий шаг внутри функции REST_deleteFile (), чтобы перейти к REST_uploadFiles (), поскольку это единственный путь управления с указанным выше псевдокодом.
Однако, как только я его жестко закодирую, по-видимому, я не могу использовать функцию REST_deleteFile () для других целей. Я надеюсь, что есть лучший способ решить эту проблему.
Заранее спасибо за помощь !



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вызовы api в JS являются асинхронными, ваша функция REST_checkFileExists ничего не возвращает, значит undefine, поэтому, если блок не будет выполняться. Аналогично для функции REST_createFolder вернется undefine. Опять же, undefine == 0 - это false.
Для того, чтобы этот код работал. Вам нужно изменить структуру ваших функций, используя цепочку асинхронный / ожидание или Обещать.
Спасибо. С моим текущим опытом работы с JavaScript слишком много "=>" выводят меня за пределы моей зоны комфорта :( Но определенно я сохраняю это в своем списке для изучения, чтобы вернуться к нему.
Самый простой способ просто опустить жестко запрограммированную часть - передать функцию обратного вызова в качестве второго параметра. Таким образом вы можете сделать функцию более многократно используемой и делать все, что захотите, когда запрос был успешным.
function REST_deleteFile(filePathName, onSuccess) {
var siteUrl = _spPageContextInfo.webAbsoluteUrl;
var webRelUrl = _spPageContextInfo.webServerRelativeUrl;
var fullUrl = siteUrl + "/_api/web/GetFileByServerRelativeUrl('" + webRelUrl + filePathName + "')";
$.ajax({
url: fullUrl,
type: "POST",
headers: {
"accept": "application/json;odata=verbose",
"content-type": "application/json;odata=verbose",
"X-RequestDigest": $("#__REQUESTDIGEST").val(),
"X-HTTP-Method": "DELETE",
"IF-MATCH": "*"
},
success: onSuccess,
error:function() {
console.info("Fail to delete the file :" + filePathName );
}
});
REST_deleteFile('path/to/file', REST_createFolder(filePathName))
Спасибо ! Это работает, и мне это достаточно легко понять.
Прочтите, как использовать
fetch(), поскольку этот метод теперь более стандартизирован, чем ajax. developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fet ch Вы можете использовать обещания или async / await. В наши дни обратные вызовы, как правило, не так популярны, но это все еще возможно.