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);

输出:

JS 同步转异步之Promise

由此,利用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("我是用来陪衬的,虽然在后边,但是异步在我后边执行");

输出:

JS 同步转异步之Promise

利用以上原理,封装一个同步转异步的函数

// 把同步的任务转成异步任务
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("我是用来陪衬的,虽然在后边,但是异步在我后边执行");

输出:

JS 同步转异步之Promise

备注: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);

输出:

JS 同步转异步之Promise

p1与p2相同,也就是说,两种生成Promise的方式是等价的。结果都是生成一个已经决议为成功的Promise实例。