您的位置:首页 > 其它

理解promise,实现异步的同步编写

2018-04-08 12:07 232 查看
MND解释:Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。
我的理解就是promise是一种完成异步功能并检查状态触发回调的机制。

1、两种常用创建方式:

声明一个变量:(声明一个promise类型的对象)

const myFirstPromise = new Promise((resolve, reject) => {
// ?做一些异步操作,最终会调用下面两者之一:
//
resolve(result); // fulfilled
// ?或
reject(error); // rejected
});
声明一个函数:(返回一个promise类型的对象)

function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
};
显而易见,如果需要给异步过程传递函数,当然要优先选择第2种方式了。

2、promise的状态

promise的中文释义为承诺,对象如其名,在未来的某一个时刻将会有状态变化进而有真实的结果。当代码执行到变量myFirstPromise或调用函数myAsyncFunction时,得到的都应该是一个空值或空对象,同时会有一个new promise()对象被构建。此时的promise对象处于一种名为pending状态,表示为初始状态。此时promise开始执行。new promise( /*...code...*/ ) 中的code只是相当于一个参数被传递给promise对象,和以往的函数调用传参的不同在于:code是函数类型的参数 (resolve, reject) => { } ,不是一个字符串、数值等等类型的参数。这个函数类型的参数code只接收resolve、reject两种类型的参数。code函数体内可以正常使用当前文件里的变量参数、函数等等。promise执行过程中,对我们来说最终的就是这个具有定制意义的code参数,该参数可以是一个XHR请求、setTimeout()函数等等。执行code,如果顺利完成,得到我们预期的正确结果,promise对象将处于一种名为fulfilled状态,表示操作成功完成。执行code,如果未完成,将可以报错,promise对象将处于一种名为rejected状态,表示操作失败。此时我们之前声明的变量或函数的调用将有一个结果:兑现承诺,得到的仍然是之前的promise,只是此时此刻,它有了新的状态,表明之前的承诺有了结果。

3、promise的回调

promise状态从pending改变后,它将触发(异步调用)相应的函数(如同我们之前常用的回调函数),这些函数存在于promise的yuanxing里如then()、catch(),当然还有一个finally()。

myFirstPromise.then(   // 记录填充值
function(val) {
console.log('兑现成功的promise', val);
})
.catch(  // 记录失败原因
(reason) => {
console.log('处理失败的 promise', reason);
});
finally回调函数:



4、promise的来源

在JavaScript的世界中,所有代码都是单线程执行的。但如网络操作,浏览器事件,都必须是异步执行。对于需要异步执行的代码,js不会立即去执行,而是把它扔到一个事件队列里面,当所有同步任务都干完了以后,再去遍历执行事件队列里面的代码。一个已经变成 resolve 状态的 promise,传递给 
then
 的函数也总是会被异步调用。
promise替代了下面这种旧式的函数,

function successCallback(result) {
console.log("It succeeded with " + result);
}

function failureCallback(error) {
console.log("It failed with " + error);
}

doSomething(successCallback, failureCallback);
提供了新式的函数:

const promise = doSomething();
promise.then(successCallback, failureCallback);
//或者
doSomething().then(successCallback).catch(failureCallback);


参考:

1、https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
2、https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: