早期的 javascript 的异步调用,都是通过传一个 callback 进去。例如:
function get_content(url, callback) {
/**
* callback 参数是一个 function。异步调用结束后就执行 callback()
*
* 例如,先访问网络,访问结束后将结果传给 callback。
*/
$.get(url, function (content) {
callback(content);
});
}
调用代码:
get_content('http://localhost/someurl.json', function (content) {
...
});
可以注意到,jquery.get 也是一个异步调用。jquery 里有很多类似的定义。
回调方法简单、容易理解,但是不够标准化,不同的方法有不同的回调参数。
后来 Promise 标准化了此类实现。原理是一样的,只是写法有标准了。还是前面的 get_content ,用 Promise 可以这样写:
function get_content(url) {
return new Promise(function (resolve, reject) {
$.get(url, function (content) {
// 回调方法。resolve 即成功后的回调。reject 为失败后的回调。
if ( !content) {
reject('no content got');
} //
else {
resolve(content);
}
});
});
}
执行代码:
get_content('http://localhost/someurl.json')
.then(function (content) {
// 成功时回调
})
.catch(function (error) {
// 失败时回调
})
.complete(function () {
// 无论成功还是失败,最后都会回调
});