參考資訊:
https://stackoverflow.com/questions/5010288/how-to-make-a-function-wait-until-a-callback-has-been-called-using-node-js
main.js
var r = ''; var vbox = require('virtualbox'); vbox.list(function(vms, error) { r = vms; }); console.log('vm: %s', r);
執行
$ node main.js [2023-08-15 01:14:04.539] [INFO] VirtualBox - linux [2023-08-15 01:14:04.546] [INFO] VirtualBox - Listing VMs vm:
由於Node.js都是透過Callback處理方式(Asynchronous),因此,如上面例子,當呼叫vbox.list()時,vbox.list()的動作已經完成,因此,會直接往下走,但是最終結果卻是要在Callback才會知道,遇到這種情況,一般會透過Event做等待,直到Callback處理完成後才把結果列印出來,不過,在Node.js的應用上,一般是使用Promise()做等待的動作,如下修改範例:
var vbox = require('virtualbox'); async function start() { var r = ''; await new Promise((resolve, reject) => { vbox.list(function(vms, error) { r = vms; resolve('ok'); }); }); console.log('vm: %s', r); } start();
呼叫resolve()並且傳入隨意字串,代表允許Promise回傳成功的結果(代表Event已經完成),反之,如果呼叫reject()並且傳入隨意字串,代表發生錯誤,Promise將會throw error,而error字串內容則是設定給reject()的字串
$ node main.js [2023-08-15 01:32:12.109] [INFO] VirtualBox - linux [2023-08-15 01:32:12.115] [INFO] VirtualBox - Listing VMs [2023-08-15 01:32:12.130] [INFO] VirtualBox - Virtualbox version detected as 6 vm: { '8591d090-e95a-423a-b99d-cf558bd0d245': [Object] }