JS学习——异步

学习内容来源:JavaScript 回调异步的 JavaScriptJavaScript PromiseJavaScript Async

JavaScript 回调

回调 (callback) 是作为参数传递给另一个函数的函数。
这种技术允许函数调用另一个函数。
回调函数可以在另一个函数完成后运行。

函数序列

JavaScript 函数按照它们被调用的顺序执行。而不是以它们被定义的顺序。

// txt = "Goodbye"
let txt;

function myDisplayer(some) {
  txt = some;
}

function myFirst() {
  myDisplayer("Hello");
}

function mySecond() {
  myDisplayer("Goodbye");
}

myFirst();
mySecond();

顺序控制

// 假设您要进行计算,然后赋值。
let txt;
function myDisplayer(some) {
  txt = some;
}

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

let result = myCalculator(5, 5);
myDisplayer(result);

// 或者,可以调用 myCalculator,并让 myCalculator 函数调用 myDisplayer
let txt;
function myDisplayer(some) {
  txt = some;
}

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

myCalculator(5, 5);

JavaScript 回调

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

// 使用回调,可以通过回调调用 myDisplayer,并在计算完成后让 myCalculator 运行回调
let txt;
function myDisplayer(some) {
  txt = some;
}

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

myCalculator(5, 5, myDisplayer);

异步的 JavaScript

与其他函数并行运行的函数称为异步(asynchronous)。
回调最常与异步函数一起使用。

JavaScript 中有很多关于异步函数的例子,在这里只列举了 setTimeout() 和 setInterval()

等待超时

在使用 JavaScript 函数 setTimeout() 时,可以指定超时时执行的回调函数

// myFunction 被用作回调。函数(函数名)作为参数传递给 setTimeout()。
// 3000 是超时前的毫秒数,所以 3 秒后会调用 myFunction()。
let txt;

setTimeout(myFunction, 3000);

function myFunction() {
  txt = "3 seconds later"
}

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

  • 正确:setTimeout(myFunction, 3000);
  • 错误:setTimeout(myFunction(), 3000);
// 若不将函数的名称作为参数传递给另一个函数,始终可以传递整个函数
// function(){ myFunction("I love You !!!"); } 用作回调。它是一个完整的函数。完整的函数作为参数被传递给 setTimeout()。
// 3000 是超时前的毫秒数,所以 3 秒后会调用 myFunction()。
let txt;

setTimeout(function() { myFunction("I love You !!!"); }, 3000);

function myFunction(value) {
  txt = value;
}

等待间隔

在使用 JavaScript 函数 setInterval() 时,可以指定每个间隔执行的回调函数

// 1000 是间隔之间的毫秒数,因此 myFunction() 将每秒调用一次
let count = 0;

setInterval(myFunction, 1000);

function myFunction() {
  count++;
}

JavaScript Promise

JavaScript Promise 对象

JavaScript Promise 对象包含生产代码和对消费代码的调用

let myPromise = new Promise(function(myResolve, myReject) {
// "Producing Code"(可能需要一些时间)

  myResolve(); // 成功时调用
  myReject();  // 出错时调用
});

// "Consuming Code" (必须等待一个兑现的承诺)
myPromise.then(
  function(value) { /* 成功后续再处理的代码 */ },
  function(error) { /* 出错后续再处理的代码 */ }
);

当执行代码获得结果时,它应该调用两个回调之一:

结果 调用
成功 myResolve(result value)
出错 myReject(error object)

Promise 对象属性

JavaScript Promise 对象可以是:

  • Pending
  • Fulfilled
  • Rejected

当 Promise 对象 "pending"(工作)时,结果是 undefined。
当 Promise 对象 "fulfilled" 时,结果是一个值。
当 Promise 对象 "rejected" 时,结果是一个错误对象。

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

注意:无法访问 Promise 属性 state 和 result。必须使用 Promise 方法来处理 Promise。

如何使用 Promise

// Promise.then() 有两个参数,一个是成功时的回调,另一个是失败时的回调。
// 两者都是可选的,因此您可以为成功或失败添加回调。
myPromise.then(
  function(value) { /* code if successful */ },
  function(error) { /* code if some error */ }
);

// myPromise 判断后把 myResolve() 作为回调函数,然后执行 function(value) {myDisplayer(value);}
// txt ="OK"
let txt;

function myDisplayer(some) {
  txt = 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);}
);
// setTimeout() 使用 Promise 的例子
let txt;

let myPromise = new Promise(function(myResolve, myReject) {
  setTimeout(function() { myResolve("I love You !!"); }, 3000);
});

myPromise.then(function(value) {
  txt = value;
});

JavaScript Async

  • async 使函数返回 Promise
  • await 使函数等待 Promise

Async 语法

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

async function myFunction() {
  return "Hello"; // 等同于 return Promise.resolve("Hello");
}

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

// 或者更简单,因为期望正常值(正常响应,而不是错误)
async function myFunction() {
  return "Hello";
}
myFunction().then(
  function(value) {myDisplayer(value);}
);

Await 语法

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

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

// txt = "I love You !!"
let txt;

async function myDisplay() {
  let myPromise = new Promise(function(myResolve, myReject) {
    myResolve("I love You !!");
  });
  txt = await myPromise;
}

myDisplay();
// setTimeout() 使用 async/await 的例子
// 3 秒后 txt = "I love You !!"
let txt;

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

myDisplay();
posted @ 2022-03-05 13:05  一只离离离  阅读(124)  评论(0编辑  收藏  举报