JS 同步转异步之Promise
同步方法在promise示例中变成异步执行:
console.log(1); let p = new Promise(resolve => { console.log(2); resolve(); console.log(3); }); console.log(4); p.then(() => { console.log(5); }); console.log(6);
输出:
由此,利用Promise实现同步转异步函数:
function syncTask() { // 同步任务函数 console.log(‘这是异步任务,没有按顺序执行‘); return 4; } function createAsyncTask() { // 利用Promise创建异步任务 var p = new Promise(function (resolve) { resolve(); }); return p; } createAsyncTask() .then(syncTask) // 异步调用syncTask .then(function (num) { // 获取syncTask函数返回值 console.log(num); }); console.log("我是用来陪衬的,虽然在后边,但是异步在我后边执行");
输出:
利用以上原理,封装一个同步转异步的函数:
// 把同步的任务转成异步任务 function createAsyncTask(syncTask) { return Promise.resolve(syncTask).then(syncTask => syncTask()); } function syncTask() { // 同步任务函数 console.log(‘这是异步任务,没有按顺序执行‘); return 4; } createAsyncTask(syncTask) // 将同步任务转为异步任务 .then(res => console.log(res));// 接收同步任务函数syncTask的返回值res console.log("我是用来陪衬的,虽然在后边,但是异步在我后边执行");
输出:
备注:Promise.resolve的用法。
// 传递一个普通的值 let p1 = new Promise(resolve => { resolve(‘成功1!‘); }); let p2 = Promise.resolve(‘成功2!‘); function printContent(params) { console.log(params); } p1.then(printContent); p2.then(printContent);
输出:
p1与p2相同,也就是说,两种生成Promise的方式是等价的。结果都是生成一个已经决议为成功的Promise实例。