用工具尽量用现成的,前提是需要非常熟悉现成的工具的api,不然学习成本比较高;当然,如果自己写的话,如果不是专家很容易出问题。比如最常见的promise,可能的问题:
---promise是个最容易出问题的地方~---------
- 如果promise和callback混合使用,处理不得当很容易出现内存泄露,造成崩溃,比如
fs.readFile(path, 'utf8', async function (err, data) {
await somethingWrong();
//这种情况下,await出现throw的话,没有关闭fs则会leak memory...灾难发生。
fs.close()...
});
- 没事儿不要去用那个await sleep,对,就是用setTimeout阻塞的那个,会造成100% cup占用,死机!!!
那怎么办?搜索 atomic-sleep, 不用感谢我~~
- 不是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 ---什么鬼??
- 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