let executor = function (resolve, reject) { let fs = require('fs'); fs.readFile('data.txt', {encoding: 'utf8'}, function (error, content) { if (error) { reject(error); //在异步行为成功时,调用reject()方法 return; } resolve(content); //在异步行为失败时,调用resolve()方法 }); }; let promise = new Promise(executor); //处理成功和失败的情况 promise.then(function (content) { console.log(content); }, function (error) { console.log(error) });
这两个回调函数的参数也就是之前异步处理的结果数据。第一个函数的参数对应resolve()的参数content,第二个回调函数对应reject()的参数error。这样我们也就能在这2个回调函数里面拿到数据,从而根据你的业务需求编写对应的结果处理程序。
需要说明的是,这两个回调函数参数都不是必须的,并不强制要求你都要处理。下面的代码里,列觉了某2种结果处理程序,语法上都是合法的。只是正常的需求下,我们一般还是需要对成功和失败都要处理。
//只处理成功的情况 promise.then(function (content) { console.log(content); }); //只处理失败的情况 promise.then(null, function (error) { console.log(error) });
2: Promise.prototype.catch()
catch()方法只有一个参数:一个只处理rejected状态的回调函数。可能会有人疑问,then()已经可以同时处理2个状态,为什么还需要catch()方法?
原因在于前面我们提到的,在then()方法里,并不强制要求你提供处理rejected的回调函数。Promise有个特性:如果你没有添加rejected处理函数,那所有的失败会被自动忽略。
可能会有些开发者只关心成功状态,而忘了提供rejected处理函数,从而给整个程序埋下隐患,这样会造成很不好的用户体验。而catch()方法就是一个明确地处理rejected的方法,而不像在then()里面,因为是非必须参数而让人很容易忽略。
背景说了那么多,我们看看catch()怎么用:
promise.catch(function (error) { console.log(error) })
其实用法很简单,它其实等价于是有reject处理函数的then():
promise.then(null, function (error) { console.log(error) });
没有语法要求一个完整的Promise处理程序必须要有catch()方法。如果你没有使用catch()的习惯,最好总是不要忘记在使用then()的时候添加reject处理函数。
或者,如果你偶尔会忘记在then()里添加reject处理函数,那么记得使用catch()来为你做最安全的保障。
以上,就是关于Promise的基本概念和使用。在平常的开发中,Promise的使用还是非常频繁的,也很好用,所以我认为掌握Promise是一个必须的功课。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章: