没事不要随便自己写promise类的工具utils

313 阅读2分钟

用工具尽量用现成的,前提是需要非常熟悉现成的工具的api,不然学习成本比较高;当然,如果自己写的话,如果不是专家很容易出问题。比如最常见的promise,可能的问题:

---promise是个最容易出问题的地方~---------

  1. 如果promise和callback混合使用,处理不得当很容易出现内存泄露,造成崩溃,比如
      fs.readFile(path, 'utf8', async function (err, data) {
       
       await somethingWrong();
       //这种情况下,await出现throw的话,没有关闭fs则会leak memory...灾难发生。
       fs.close()...
       
      });

  1. 没事儿不要去用那个await sleep,对,就是用setTimeout阻塞的那个,会造成100% cup占用,死机!!!

那怎么办?搜索 atomic-sleep, 不用感谢我~~

  1. 不是async的东西,前面别用await,别找事儿,原因如下:
function f() {
  console.log('在f里面');
}

async function g() {
  console.log('开始g');
  await f();
  console.log('结束g');
}

console.log('开始脚本')
g();  //如果你想什么鬼不出现,这里需要是 await g();
console.log('结束脚本')

输出结果超出你的预期

开始脚本
开始g
在f里面
结束脚本 ----什么鬼??
结束g    ---什么鬼??
  1. promise.race这些自己不要写,不然出现麻烦,不知道怎么回事,如下。
(async () => {
  const promiseTimeout = function(promise, ms) {
    // Create a promise that rejects in <ms> milliseconds
    let timeout = new Promise((resolve, reject) => {
      let id = setTimeout(() => {
        clearTimeout(id);
        // console.log('util.promiseTimeout out in ' + ms + 'ms.');
        resolve(false);
      }, ms);
    });

    return Promise.race([promise, timeout]);
  };

  const promiseFirst = () => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve(true);
      }, 4000);
    });
  };

  const res = await promiseTimeout(promiseFirst, 2300);

  console.log('res', res);
  //请问这里输出是什么??
  //有没有阻塞?
})();

回答:这里输出的是 [Function];没有阻塞,立即输出;why!!!

回答:因为,promiseFirst是个函数,2300是数字,普通variable, promiseRace的话立即输出;该怎么改啊?

回答: const res = await promiseTimeout(promiseFirst(), 2300); 因为promiseFirst是个函数,不是Promise。

其实应该老实一点,分开步骤,不容易错。

比如: const newPromise=promiseFirst()
       await promiseTimeout(newPromise, 2300)

鬼鬼祟祟的promise,看一个文章就够了系列~~ -Frank