Promise 和 for 循环问题,循环需要上一次的结果 需要计算工序的时间,有开始时间,结束时间,下一道工序的开始的时间是上一道工序的结束时间,使用 promise 和 遍历实现 for 循环中的 promise 如何正确的 resolve promise 是异步的,需要到下一个 tick 才能执行 then,除非 break 或者 return,否则就是等 for 循环执行完毕才能 reso…

  1. Promise 和 for 循环问题,循环需要上一次的结果

    需要计算工序的时间,有开始时间,结束时间,下一道工序的开始的时间是上一道工序的结束时间,使用 promise 和 遍历实现

// reduce方法
var array = [1, 2, 3, 4];
var p = val => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(val);
      resolve(val);
    }, 1000);
  });
};
var run = arr => {
  return arr
    .reduce((chain, val) => {
      return chain.then(res => {
        return p(val);
      });
    }, Promise.resolve())
    .then(res => {
      console.log('down');
    });
};
run(array);
/*
  每隔1s依次打印数组元素
  1
  2
  3
  4
  done
*/
// 立即执行函数方法
var array = [1, 2, 3, 4];
var p = val => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(val);
    }, 1000);
  });
};
(async function() {
  for (var i = 0; i < array.length; i++) {
    let result = await p(array[i]);
    console.log(result);
  }
})();
/*
  每隔1s依次打印数组元素
  1
  2
  3
  4
*/
  1. for 循环中的 promise 如何正确的 resolve
// 错误的做法
function run(val) {
  let m = { a: 1, b: 2 };
  let n = {};
  return new Promise((resolve, reject) => {
    for (let key in m) {
      n[key] = m[key];
      resolve(n);
    }
  });
}
run().then(res => {
  console.log(res);
});
// 预期{a:1},实际输出{a:1,b:2}

promise 是异步的,需要到下一个 tick 才能执行 then,除非 break 或者 return,否则就是等 for 循环执行完毕才能 resolve

// 正确的做法
function run(val) {
  let m = { a: 1, b: 2 };
  let n = {};
  return new Promise((resolve, reject) => {
    for (let key in m) {
      n[key] = m[key];
      return resolve(n);
    }
  });
}
run().then(res => {
  console.log(res);
});
// 输出{a:1}

暂无评论