浅谈JS Promise
介绍
JS Promise是一种规范化的解决异步操作的方案,由于JS具有单线程、异步操作等特点,这使得JS Promise显得更加重要。在这篇文章中,我们将讨论JS Promise并提供示例。我们会通过以下步骤详细介绍JS Promise:
- Promise概念
- Promise状态
- Promise如何使用
- Promise示例1
- Promise示例2
- Promise常见问题
Promise概念
从大的概念上来说,Promise是一种处理异步操作的方式。 更具体的说,Promises是对具有不确定执行时间的异步操作的值或代理。 Promise通过向异步操作添加异步行为来改善代码可读性和可维护性。
Promise状态
Promise共有三种状态:pending(等待态),fulfilled(成功),rejected(失败)。
- pending(等待态):初始状态,既不是成功,也不是失败状态。
- fulfilled(成功):操作成功完成,promise的结果为value,这个状态称为"resolved"。
- rejected(失败):操作失败,接受到一个reason(表示Promise被拒绝的原因)
Promise状态转移图:
┌─────────┐
│ pending │
└─────────┘
│
┌───────────────┬────┴────┬───────────────────┐
│ │ │ │
┌─┴─┐ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐
│Ful│ │Reject │ │ Fulfill│ │Rejet │
│fil│ │ ed │ │ ment │ │ ed │
└───┘ └───────┘ └───────┘ └───────┘
Promise如何使用
我们可以使用new Promise()构造函数来创建Promise对象,该构造函数接受一个参数一个函数,这个函数的两个参数是resolve和reject。当异步事件执行成功时,我们使用resolve()来通知Promise对象异步操作已成功完成,当异步事件执行失败并返回错误时,我们应该使用reject()。 示例代码:
var promise = new Promise(function(resolve, reject){
// 异步操作
if(异步操作成功){
resolve(value)
} else {
reject(error)
}
})
Promise对象的状态会在异步操作完成之后自动变为fulfilled或rejected。
在promise对象中可以通过then方法处理异步操作的成功和失败两种状态。then方法接受两个函数作为参数: 第一个函数是Promise成功时所使用的函数,第二个函数是Promise失败时所使用的函数。
promise.then(successFunction, failFunction)
Promise示例1
根据初始化状态,我们使用resolve和reject来设置异步操作的返回结果。
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("异步操作成功");
}, 2000);
});
promise.then(function(value) {
console.log(value); // "异步操作成功"
}, function(error) {
console.log(error);
});
console.log("程序执行结束");
上述示例中,我们使用setTimeout模拟异步操作。在2秒后,我们使用resolve设置Promise的成功状态。在then方法中,我们指定了一个成功函数,它将作为参数传递,并使用console.log()输出对应的结果字符串。最后,我们输出了一条程序执行结束的消息。
输出结果如下:
程序执行结束
异步操作成功
Promise示例2
下面的例子演示如何使用Promise实现异步操作。
function get(url) {
return new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = function() {
if (xhr.status === 200) {
resolve(xhr.response);
} else {
reject(Error(xhr.statusText));
}
};
xhr.onerror = function() {
reject(Error("Network Error"));
};
xhr.send();
});
}
get('https://api.github.com/users/hellojiayu')
.then(function(response) {
console.log('success: ',response);
}, function(error) {
console.log('error: ',error);
});
上述示例中,我们使用XMLHttpRequest对象访问api。如果请求成功,我们使用resolve方法返回response对象,并通过then函数的第一个参数传递。如果请求失败,我们使用reject方法返回错误信息,并通过then函数的第二个参数传递。
常见问题
如何处理多个Promise对象?
- 使用Promise.all():可以将多个Promise实例包装成一个新的Promise实例,成功的结果按顺序返回所有的操作结果,失败的结果则按照顺序返回失败原因:
Promise.all([promise1, promise2, promise3]).then(function(results){
//成功的回调函数
console.log(results)
}).catch(function(reason){
//失败的回调函数
console.log(reason)
});
- 使用Promise.race():只有一个Promise实例执行完毕,就返回它的结果:
Promise.race([promise1, promise2, promise3]).then(function(result) {
console.log(result);
});
如何中断Promise?
Promise对象不能被中断,但是我们可以在Promise执行成功或执行失败时,处理回调函数。
如何捕获Promise中的异常?
使用.catch()方法处理Promise抛出的异常。
var promise = new Promise(function(resolve,reject){
throw new Error('promise error test')
})
promise.catch(function(error){
console.log(error)
})
输出结果:
Error: promise error test
结论
在这篇文章中,我们探讨了JS Promise的概念,状态转移图和如何使用Promise。 我们还提供了两个使用Promise的示例,并解答了一些常见问题。 通过学习Promise,我们可以更好地处理异步事件,通过规范代码来增加可读性和可维护性,减少代码中的错误和难以跟踪的复杂性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈js promise看这篇足够了 - Python技术站