JavaScript-Promise & async/await 使用

503 阅读2分钟

JavaScript-Promise & async/await 使用

Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值.

Promise 对象是一个代理对象(代理一个值),被代理的值在 Promise 对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的 promise 对象

一个 Promise 有以下几种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

img

function myAsyncFunction(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.onload = () => resolve(xhr.responseText);
    xhr.onerror = () => reject(xhr.statusText);
    xhr.send();
  });
}

请求

var getData = function(url) {
  var promise = new Promise(function(reslove, reject) {
    var req = new XMLHttpRequest();
    req.open("GET", URL, true);
    req.responseType = "json";
    req.setRequestHeader("Accept", "application/json");
    req.onload = function() {
      if (req.status === 200) {
        resolve(req);
      } else {
        reject(new Error(req.statusText));
      }
    };
    req.onerror = function() {
      reject(new Error(req.statusText));
    };
    req.send();
  });
  return promise;
};

getData.then(res => console.log(res)).catch(err => console.log(err));
let promise = new Promise((resolve, reject) => {
  console.log("Promise1");
  resolve();
  console.log("Promise2");
});

promise.then(() => {
  console.log("resolved.");
});

console.log("Hi!");

// Promise1
// Promise2
// Hi!
// resolved

Promise.all

其中的一个请求失败了就会走 catch

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, "foo");
});

Promise.all([p1, p2, p3]).then(values => {
  console.log(values); // [3, 1337, "foo"]
});

Promise.allSettled

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
  setTimeout(reject, 100, "foo")
);
const promises = [promise1, promise2];

Promise.allSettled(promises).then(results =>
  results.forEach(result => console.log(result.status))
);

// expected output:
// "fulfilled"
// "rejected"

Promise.race

返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。

const promise1 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 500, "one");
});

const promise2 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, "two");
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

async/await

const awaitWrap = promise => {
  return promise.then(data => [null, data]).catch(err => [err, null]);
};
async function use() {
  const [err, data] = await awaitWrap(fetchData());
  console.log("err", err);
  console.log("data", data);
}