繁体   English   中英

如何在异步代码完成之前停止我的代码执行?

How do I stop my code from executing until an asynchronous piece of code has completed?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

今天我一直在努力让一些 javascript 代码工作。

此代码的目标是在调用 recordFormSubmission ZC1C425268E68385D1AB5074C17A94F1 之前,在 fileNameObj 中填充 ajax function 调用返回的所有文件名。

function uploadSubmissionFiles(files)
{
     ...
     var promiseToUploadFiles = new Promise((resolve,reject) => 
     {
          $.ajax(
                {
                    url: "./includes/ajaxColdfusion/fillout/submittedFileUpload.cfc?method=uploadSubmittedFile",
                    type: "POST", 
                    data: formData,
                    enctype: 'multipart/form-data',
                    contentType: false,
                    processData: false
                }
            )
            .then( function(response)
                {
                    var responseElements = response.getElementsByTagName("string");
                    var resultMessage = responseElements[0].innerHTML;
                    console.log("File upload result for " + fileUploadForm.id + ": " + resultMessage);

                    if(resultMessage == "success")
                    {
                        //On success, responseElements[1] contains the name of the file that was saved to the server. We record it!
                        fileNamesObj[formElementPK] = responseElements[1].innerHTML;
                    }
                    else
                    {
                        //On failure, responseElements[1] contains the error message for what happened during the upload
                        fileSubmissionErrors.push(responseElements[1].innerHTML);
                        fileNamesObj[formElementPK] = "error.png";   
                    }
                }
            );
     }
     ...
}

await uploadSubmissionFiles(filesToUpload).then( function(fileNameObj)
     {
          recordFormSubmission(..., fileNameObj)
     }

以上是这段代码的所有重要部分。 就目前而言,recordFormSubmission() 被调用并在 fileNamesObj 变量填充从 ajax function 返回的文件名之前执行。 这一定意味着代码在继续执行之前没有等待 ajax 完成执行,即使已经实现了 promise。

我想我的问题是,如果我希望 javascript 代码等到所有 ajax 函数在调用 recordFormSubmission() 之前完成,我做错了什么?

我可能会在这里想到一个投票解决方案,但我想有一种方法可以通过承诺或更好的实践来解决这个问题。

1 个回复

尝试这个。

async function uploadSubmissionFiles(files)
{
     ...
     var promiseToUploadFiles = () => {
         return new Promise((resolve,reject) => 
             {
                  $.ajax(
                        {
                            url: "./includes/ajaxColdfusion/fillout/submittedFileUpload.cfc?method=uploadSubmittedFile",
                            type: "POST", 
                            data: formData,
                            enctype: 'multipart/form-data',
                            contentType: false,
                            processData: false
                        }
                    )
                    .then( function(response)
                        {
                            var responseElements = response.getElementsByTagName("string");
                            var resultMessage = responseElements[0].innerHTML;
                            console.log("File upload result for " + fileUploadForm.id + ": " + resultMessage);

                            if(resultMessage == "success")
                            {
                                //On success, responseElements[1] contains the name of the file that was saved to the server. We record it!
                                fileNamesObj[formElementPK] = responseElements[1].innerHTML;
                            }
                            else
                            {
                                //On failure, responseElements[1] contains the error message for what happened during the upload
                                fileSubmissionErrors.push(responseElements[1].innerHTML);
                                fileNamesObj[formElementPK] = "error.png";   
                            }
                        }
                    );
             }
        }
    await promiseToUploadFiles();
     ...
}

有必要将您的 promise 包装在 function 中,并在调用后等待其完成。 当您将 promise 分配给一个简单变量时,请求立即开始工作,代码继续运行,无需等待完成

1 如何强制我的应用程序停止一切,直到一行代码完成它的任务

我正在使用 Kotlin 和 Android Studio 我需要先过滤掉一个列表,然后才能对它做任何事情。 但是,我的代码正在异步运行并跳过它并运行需要过滤器列表但仅在过滤之前使用未过滤版本的函数。 是否有一个 function 或支架东西我可以包装过滤 function 以强制应用程序等待它完成 ...

2 如何在代码完成之前停止执行 FOR 循环

我做了这个东西。 它除了向我自己展示之外没有其他目的。 本质上,我正在循环移动我在屏幕周围创建的视图。 问题是它不会等到一个 animation 完成后再启动另一个,因此视图绕过前两个并在 for 循环完成后在最后一个toastRect结束,并且它不会继续移动那。 在继续下一个之前,如何强制代码完成 ...

3 如何停止执行React代码直到axios请求完成?

我正在使用React JS。 首先,我需要使用REST API从数据库中获取数据,并在此结果的基础上设置一些变量,这些变量将进一步传递给另一个类。 现在,我想通过axios发出同步请求,以便仅在设置数据控制之后才继续。 简而言之,我想停止渲染代码,直到将变量设置为数据为止。 如何通过 ...

9 如何将我的代码修改为异步的?

下面,我写了一个 function ,它接受一个数组和一个键来搜索并计算键与数组中元素匹配的次数。 我正在尝试修改我的 function 以异步计算匹配数,但不知道如何最好地处理 go。 任何见解或示例将不胜感激。 我的代码: ...

10 如何停止指令执行直到给定时间?

我有一个从服务器检索数据的异步函数,并且有一个指令应该显示异步函数检索的任何数据。 我想做的是在指令中将ng-show设置为false,假设除非将ng-show设置为true,否则指令不会加载。 ng-show将保持为false,直到我的异步函数检索到数据为止。 问题是这不起作用, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM