异步与标准回调混合在一起

时间:2019-12-19 18:58:58

标签: javascript async-await es6-promise

我刚刚开始使用Java语言学习Promise,并偶然遇到了async/await

据我了解,如果我将一个函数指定为async,则javascript将始终包装函数的内容并返回Promise而不是返回的内容。

我们假定以下情况:

async function httpRequest() {
   oReq = new XMLHttpRequest();
   oReq.addEventListener("load", function() {
      return this.responseText;
   });

   oReq.open("GET", "http://some.url.here");
   oReq.send();
}

httpRequest().then(function(httpResult) {
    console.log(httpResult);
}); 

我是否正确地假设上述情况将不起作用,因为httpRequest()未返回任何内容,XMLHttpRequest的回调仅返回了某些内容,因此我的结果很可能是{{1 }}?

如果可以,我将如何解决undefined使其在httpRequest()情况下工作?

2 个答案:

答案 0 :(得分:2)

这里提供的是一个执行异步操作的异步函数,该操作使用promise。这意味着您需要设置一个函数来显式管理和返回承诺。您不需要此处的async关键字,因为您想显式地return创建的Promise,而不是由async关键字(不能直接为您创建)创建的承诺管理)。

function httpRequest() {

   // Return a promise (this is what an async function does for you)
   return new Promise(resolve => {
     const oReq = new XMLHttpRequest();
     oReq.addEventListener("load", function() {

        // Resolve the promise when the async operation is complete.
        resolve(this.responseText);
     });

     oReq.open("GET", "http://some.url.here");
     oReq.send();
   };
}

现在该函数显式返回一个promise,可以像await函数一样async编辑它。或像其他承诺一样与then()一起使用。

async function someFunction() {
  // await
  const awaitedResponse = await httpRequest();
  console.log(awaitedResponse);

  // or promise chain
  httpRequest().then(responseText => console.log(responseText));
};

答案 1 :(得分:-1)

基本上,您正在尝试编写一个async函数,而该函数中没有任何等待的内容。当代码中存在某种异步性时,您可以使用async / await;而在您的代码中则没有异步性。

这是一个可能有用的示例:

const getItemsAsync = async () => {
    const res = await DoSomethingAsync();
    return res.items;
}

const items = await getItemsAsync();

如您所见,DoSomethingAsync是一个等待结果的异步函数,res。此时,代码将暂停。一旦诺言得以解决,代码将恢复并因此返回res.items,这意味着items实际上将包含异步函数的结果。

此外,async / await只是一种空间语法,通过赋予其更同步的形式(而不是实质内容)来使代码更具可读性。

如果您真的想使其异步,则可以使同步代码合理化,以使其返回等待的诺言,然后将其解决或拒绝。