Promise
静态方法Promise.resolve(value)可以认为是new Promsie()的快捷方式,比如Promise.resolve(43);可以认为是以下代码的语法糖:
new Promise(function(resolve) { resolve(43) })这段代码中的resolve(42);会让这个promise对象立即进入成功状态,该方法的返回值也是一个promise对象,我们可以像下面接着对其返回值进行.then调用。
Promise.resolve(43).then((value) => {console.log(value)})Promise.resolve作为new Promise()的快捷方式,在进行promise对象的初始化或者编写测试代码的时候都非常方便。
Promise.reject(error)是和Promise.resolve(value)类似的静态方法,是new Promise()方法的快捷方式。
比如Promise.reject(new Error(“出错了”))就是下面代码的语法糖形式。
new Promise((resolve, reject) => { reject(new Error("出错了")); }) Promise.reject(new Error("出错了")).catch(error => { console.error(error); })它和Promise.resolve(value)的不同之处在于promise内调用的函数是reject而不是resolve,这在编写测试代码或者进行debug时说不定用得上。
上面的promise链执行顺序为:
若task出现异常时
function taskA() { console.log("taskA"); throw new Errow("这是一个错误") } function taskB() { console.log("taskB"); } function finalTask() { console.log("finalTask"); } function rejected(err) { console.log(err); } Promise .resolve() .then(taskA) .then(taskB) .catch(rejected) .then(finalTask); //最后结果为taskA 报错 finalTask此时会跳过taskB,按照taskA -> rejected -> finalTask这个流程来处理
上面的例子中task都是独立的,只是简单被调用而已,这时如果taskA想给taskB传递一个参数该怎么办那?
function taskA(count) { console.log("taskA", count); return count; } function taskB(count) { console.log("taskB", count + 1); return count + 1; } function taskC(count) { console.log("taskC", count * 2); return count * 2; } Promise.resolve(1).then(taskA).then(taskB).then(taskC); //最后结果为 //taskA 1 //taskB 2 //taskC 4