Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IF语句的控制流&;异步函数_Javascript_Node.js_Asynchronous_Structure - Fatal编程技术网

Javascript IF语句的控制流&;异步函数

Javascript IF语句的控制流&;异步函数,javascript,node.js,asynchronous,structure,Javascript,Node.js,Asynchronous,Structure,我的代码结构如下: IF (something) { ..stuff ..Asynchronous Function Call } ELSE (something) { ..stuff ..Asynchronous Function Call } ..more stuff 假设条件满足,代码执行'stuff',然后进入异步函数调用。如果假设等待异步函数调用完成,它会简单地执行调用,但不执行IF语句,同时执行“更多内容”吗 或 它是否完成等待异步函数调用完成执行,然后像正常的IF语句块一样继续“

我的代码结构如下:

IF (something) {
..stuff
..Asynchronous Function Call
}
ELSE (something) {
..stuff
..Asynchronous Function Call
}
..more stuff
假设条件满足,代码执行'stuff',然后进入异步函数调用。如果假设等待异步函数调用完成,它会简单地执行调用,但不执行IF语句,同时执行“更多内容”吗

它是否完成等待异步函数调用完成执行,然后像正常的IF语句块一样继续“more stuff”

在前面的例子中,有没有关于如何确保异步函数调用在退出IF块之前完成的建议

**注意,我在两个异步函数调用中都包含了更多内容,以确保调用在继续之前完成,但我觉得这是一个非常糟糕的编程,因为如果我有50个ELIF,我将不得不复制粘贴该代码50次,而不是仅仅将其放在if语句的末尾


非常感谢您提供的任何帮助

你的第一个选择是发生什么


您不必复制/粘贴N次。只需将“更多内容”放入函数中,并将该函数传递给所有异步回调。回调可以在完成正常处理后调用“more stuff”函数。

您可以使用JavaScript轻松轻松地实现这一点。请查看以下链接:

JavaScript承诺的基本思想是使用可以按特定顺序执行的异步调用。像这样:

$.when(GET_PRODUCTS).then(
 IF_SUCCESS DO THIS
 ELSE DO THAT
).fail(
 SHOW MESSAGE
 CLEAN EVERYTHING BECAUSE SOMETHING WRONG HAPPENED
).done(
 CLEAN EVERYTHING BECAUSE EVERYTHING WENT OKAY
)
这样,您就可以使代码更易于维护。刚开始掌握它并不容易,但尝试一下,会让你省去很多头疼

它是否完成等待异步函数调用完成执行


不,这不是“异步”的意思。关键是它不会等待。该函数将在将来的某个时间点运行并完成;执行流立即继续到下一行。

对于给定的代码,
在执行异步函数时会发生更多的事情。它不会等待异步函数返回结果

根据您的“node.js”标记,我假设您的问题是关于服务器上的异步调用。但是,您可以将该行为与客户端AJAX调用进行比较

假设你有这个:

var nav = document.getElementById('nav');

function async(params) {
    var xhr = new XMLHttpRequest();

    // set up your request

    xhr.onreadystatechange = function() {
        // some conditions, and then on success:
        nav.style.color = 'black';
    };

    xhr.open('GET', 'resource.php'+params, true);

    // send your request
}

if ( /* condition */ ) {
    async( /* some parameter */ );
} else {
    nav.style.color = 'red';
}

如果要运行上述代码,无论哪种方式,您的
#nav
元素的颜色将首先设置为红色,但如果异步请求返回并得到成功响应,则
#nav
元素的颜色将为黑色。这是一个非常简单且可能不切实际的示例,但它可以很容易地进行测试,以确认异步调用将异步进行。

与前面提到的其他示例一样,您可以使用Promises、async.js、step.js等来控制流。如果使用启用了--harmony的最新版本的node,也可以使用生成器。

Ipromise向您展示正确的方法。首先,如果条件是您要寻找的,则为异步。其次,你需要一个完整的例子。您必须修改AJAX请求的URL,并设置一些服务器代码以提供响应。最后我将提供一个基线PHP文件

如此有效:如果我的
if
条件对JavaScript解析器来说花费的时间太长怎么办?JavaScript使用承诺。我不会发疯,我的目标是提供一个基线。在脚本的末尾,您将注意到成功或失败级别。此脚本需要两个异步if条件。此外,我将
脚本
元素保留在
头部
元素中,而不是廉价/静态/脆弱。最后,确保更改HTTP查询并在服务器上确认它,无需生成冗余文件。浏览器兼容性很好,除了不支持IE11,但是我只遇到了非常具体的用例需要这样做,因此如果您考虑将此代码用于非技术受众,我强烈建议您重新考虑解决给定问题的初始方法

<head>
<script defer="true" type="application/javascript">
//<![CDATA[
function request(method,url)
{
 return new Promise(function(resolve, reject)
 {
  var req = new XMLHttpRequest();
  req.open(method,url);
  req.withCredentials = true;
  req.onerror = function() {reject(Error('Network error.'));};
  req.onload = function() {if (req.status == 200) {resolve(req.response);} else {reject(Error(new Object({'response':req.response,'status':req.statusText})));}};
  req.send();
 });
}

function aysn_if()
{
 request('get','https://www.example.com/test.php?t=1').then(function(response)
 {
  console.log('Success, level one if!', response);
  request('get','https://www.example.com/test.php?t=2').then(function(response)
  {
  console.log('Success, level two if!', response);
  },
  function(error)
  {
   console.error('Failed, second level.', error);
  });
 },
 function(error)
 {
  console.error('Failed, first level.', error);
 });
}

document.addEventListener('DOMContentLoaded', function (e) {aysn_if();},false);
//]]>
</script>
</head>

//
PHP

<?php
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Origin: '.((isset($_SERVER['HTTP_ORIGIN'])) ? $_SERVER['HTTP_ORIGIN'] : '*'));
//JUST for testing, don't send this stuff outside of test environments!
ksort($_SERVER);
print_r($_SERVER);
?>

根据异步的定义,异步函数不会等待其他任何事情发生。完成后,它将完成执行,可能在毫秒内,也可能在4小时内。请勿编辑您的帖子以包含自我提升。这公然违反了整个网站的规则。当前有一个挂起的编辑要删除它。