JavaScript-Asycn

88 阅读2分钟

JavaScript 回调

回调是作为参数传递给另一个函数的函数。

function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}

function myCalculator(num1, num2, myCallback) {
  let sum = num1 + num2;
  myCallback(sum);
}

myCalculator(5, 5, myDisplayer);

在上面的例子中, myDisplayer 是函数的名称。

它作为参数传递给 myCalculator()

当您将函数作为参数传递时,请记住不要使用括号。

正确:myCalculator(5, 5, myDisplayer);

错误:myCalculator(5, 5, myDisplayer());

异步 JavaScript

setTimeout(myFunction, 3000);

function myFunction() {
  document.getElementById("demo").innerHTML = "yes i do";
}

JavaScript Promise 对象

Promise 对象属性

JavaScript Promise 对象可以是:

  • Pending
  • Fulfilled
  • Rejected

Promise 对象支持两个属性:state 和 result

myPromise.statemyPromise.result
"pending"undefined
"fulfilled"结果值
"rejected"error 对象

您无法访问 Promise 属性 state 和 result。

您必须使用 Promise 方法来处理 Promise。

function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}

let myPromise = new Promise(function(myResolve, myReject) {
  let x = 0;

// 生成代码(这可能需要一些时间)

  if (x == 0) {
    myResolve("OK");
  } else {
    myReject("Error");
  }
});

myPromise.then(
  function(value) {myDisplayer(value);},
  function(error) {myDisplayer(error);}
);

Async 语法

"async and await make promises easier to write"

async 使函数返回 Promise

await 使函数等待 Promise

函数前的关键字 async 使函数返回 promise:

async function myFunction() {
  return "Hello";
}

等同于:

async function myFunction() {
  return Promise.resolve("Hello");
}

实例

async function myFunction() {
  return "Hello";
}
myFunction().then(
  function(value) {myDisplayer(value);},
  function(error) {myDisplayer(error);}
);

Await 语法

函数前的关键字 await 使函数等待 promise:

let value = await promise;

await 关键字只能在 async 函数中使用。

等待超时

async function myDisplay() {
  let myPromise = new Promise(function(myResolve, myReject) {
    setTimeout(function() { myResolve("I love You !!"); }, 3000);
  });
  document.getElementById("demo").innerHTML = await myPromise;
}

myDisplay();

浏览器支持

ECMAScript 2017 引入了 JavaScript 关键字 async 和 await

下表注明了首个完全支持两者的浏览器版本:

ChromeIEFirefoxSafariOpera
Chrome 55Edge 15Firefox 52Safari 11Opera 42
2016 年 12 月2017 年 4 月2017 年 3 月2017 年 9 月2016 年 12 月