Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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 异步/等待时间';t等待上一个功能完成_Javascript_Ajax_Async Await - Fatal编程技术网

Javascript 异步/等待时间';t等待上一个功能完成

Javascript 异步/等待时间';t等待上一个功能完成,javascript,ajax,async-await,Javascript,Ajax,Async Await,我正在构建一个web应用程序,它需要多次查询我的数据库,每次都从第一次数据库调用获取数据以进行下一次调用。在这种情况下,我需要等到上一次通话结束后再继续。异步/等待不是正确的方法吗?如果是的话,我在这里错过了什么 var firstCall = new XMLHttpRequest(); var firstCallData; async function sendFirstCall() { firstCall.open('GET', queryURL); firstCall.onload

我正在构建一个web应用程序,它需要多次查询我的数据库,每次都从第一次数据库调用获取数据以进行下一次调用。在这种情况下,我需要等到上一次通话结束后再继续。异步/等待不是正确的方法吗?如果是的话,我在这里错过了什么

var firstCall = new XMLHttpRequest();
var firstCallData;
async function sendFirstCall() {
  firstCall.open('GET', queryURL);
  firstCall.onload = function() {
    firstCallData = JSON.parse(firstCall.responseText);
  };
  firstCall.send();
};

async function logData() {
  await sendFirstCall();
  console.log(firstCallData);
}

logData();

我对JS并不完全陌生,但我并不经常编写它,而且我肯定不太熟悉async/await的工作原理。感谢您的帮助

sendFirstCall函数没有返回一个
承诺
(无论如何都不是一个特别有意义的承诺),因此没有什么需要等待的
。我不知道<代码> XMLHttpRequest <代码>是否有任何现代<代码>承诺>代码>功能(工具如<代码> FETCH < /COD>或AXIOS,您可以考虑查看这些代码),但您可以将其封装在<代码>承诺< /代码>中。也许是这样的:

function sendFirstCall() {
  return new Promise(function(resolve, reject) {
    firstCall.open('GET', queryURL);
    firstCall.onload = function() {
      firstCallData = JSON.parse(firstCall.responseText);
      resolve();
    };
    firstCall.send();
  });
}
注意,我还从函数定义中删除了
async
。这里并没有真正使用async/await,只是手动返回一个
Promise
(它本身是可等待的,所以消费代码仍然可以使用
await


或者,
Promise
本身可以解析为数据:

function sendFirstCall() {
  return new Promise(function(resolve, reject) {
    firstCall.open('GET', queryURL);
    firstCall.onload = function() {
      resolve(JSON.parse(firstCall.responseText));
    };
    firstCall.send();
  });
}
那么消费代码将是:

firstCallData = await sendFirstCall();
这样,操作本身就没有副作用,它只是(异步地)产生一个值,并且使用代码决定如何处理该值



如果
XMLHttpRequest
失败或导致错误代码,您还可以使用
Promise
中的
reject
回调来处理错误。否则,失败/错误将丢失,
Promise
将永远无法解析或拒绝。

您的
sendFirstCall
函数不会返回一个Promise。@事实上,Pointy id会返回一个Promise(因为它是异步的),但它是一个
Promise
函数,它是自动解析的。@derpirscher是的,完全正确。