promise:

大多数浏览器中不能终止的 Promise 链里的 rejection,要加catch。 promise将以前的回调地狱转成了promise链,同样要避免嵌套

doSomething()
.then(function(result) {
  return doSomethingElse(result);
})
.then(newResult => doThirdThing(newResult))
.then(() => doFourthThing())
.catch(error => console.log(error));

避免timeout和promise时序问题,用promise将timeout封装起来:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);

为什么创建实例里的函数参数名为resolve,而不是reject。

var _reject = function(err) {
  return Promise.reject(err)
}

var resolver = function(resolve, reject) {  
    return resolve(_reject(new Error("reject within resolve")))
}

var p = new Promise(resolver);

p.then(function(data) {
  console.log("resolved", data)
},function(data) {
  console.log("rejected:", data, "promise:", p)
})

alt

promise从pending状态转化成其他状态时,并不能判定就是fulfilled,resolve的意思是决议,也就是当前promise还在判断阶段,如果非要说reject是拒绝而resolve就是成功,这是不准确的,就如上例,


async:

promise有拒绝事件PromiseRejectionEvent,nodejs里会输出错误(reject或者catch),但是async就要自己try catch喽

async function foo() {
  try {
    const result = await doSomething();
    const newResult = await doSomethingElse(result);
    const finalResult = await doThirdThing(newResult);
    console.log(`Got the final result: ${finalResult}`);
  } catch(error) {
    failureCallback(error);
  }
}

这是巧妙的用for of 遍历执行异步操作

let result;
for (const f of [func1, func2, func3]) {
  result = await f(result);
}

promise其他方法

Promise.resolve() 和 Promise.reject() 是手动创建一个已经 resolve 或者 reject 的 Promise 快捷方法。它们有时很有用。

Promise.all() 和 Promise.race() 是并行运行异步操作的两个组合式工具。