我想找到一些方法來寫我的一般promisify函數來使用異步和socket.io等待
這是我的代碼第一個未能完成,而第二個成功沒有問題。使用這兩種方式來提示Socket.IO的server.close有什麼區別?
這兩者有什麼區別?爲什麼第一個失敗?
function promisify (func) {
return new Promise((resolve, reject) => func(() => {
resolve()
console.log('closeServer')
}))}
async function timer1() {
await Promise.resolve(promisify(server.close))
}
function closeServer() {
return new Promise((resolve, reject) => server.close(() => {
resolve()
console.log('closeServer')
}))}
async function timer2() {
await Promise.resolve(closeServer())
}
讓我告訴你們的日誌,
第二個
> nodemon src/index.js --exec babel-node --presets es2015
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `babel-node src/index.js --presets es2015`
Server listening at port 3000
^C(node:28061) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property '_handle' of undefined
(node:28061) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
第二
> nodemon src/index.js --exec babel-node --presets es2015
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `babel-node src/index.js --presets es2015`
Server listening at port 3000
^CcloseServer
'爲什麼第一次失敗會以什麼方式失敗?順便說一下,這些函數都不會拒絕 –
「*'resolve(); if(false)reject(err)'*」 - Wat? – Bergi
我認爲這是[如何在回調中訪問正確'this'/context的副本](https://stackoverflow.com/q/20279484/1048572) - 這是您的代碼之間的明顯區別:'close '使用'promisify'時不會被稱爲'server'的方法。 – Bergi