具有多个REST API的JavaScript控制流?

时间:2018-12-28 08:27:44

标签: javascript rest

我正在编写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);
}

以下是我在Google搜索中收集的JavaScript成分。 我确认每个功能都可以在我的环境中工作,但无法弄清楚如何在保持每个功能可重用的同时粘合它们。我感谢专家的建议。

http://codejaw.com/yezime

例如,我可以将REST_deleteFile()函数中的下一步硬编码为REST_uploadFiles(),因为这是具有上述伪代码的唯一控制路径。

但是,显然,一旦我对其进行硬编码,就无法使用REST_deleteFile()函数 用于其他目的。我希望有一个更好的方法来解决这个问题。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

JS中的api调用是异步的,您的函数REST_checkFileExists未返回任何内容,意味着undefine,因此如果块将不执行。同样,对于功能REST_createFolder,将返回undefine。同样,undefine == 0false
为了使此代码起作用。您需要使用async/awaitPromise链来更改函数结构。

答案 1 :(得分:1)

忽略硬编码部分的最简单方法是将回调函数作为第二个参数传递。这样,您就可以使函数更具可重用性,并在请求成功后做您想做的任何事情。

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.log("Fail to delete the file :" + filePathName );
        }
    });


REST_deleteFile('path/to/file', REST_createFolder(filePathName))