2017-09-24 75 views
1

對於Node庫,我希望能夠將日誌函數傳遞給返回Promise的函數。默認情況下,記錄器將爲console.log,但可能會被其他內容替換,具體取決於用例。將日誌函數傳遞給Promise

// define custom logger 
const opts = { 
    log: console.log, 
    error: console.error 
}; 

const spawnPromise = (cmd, args, opts) => { 
    return new Promise((resolve, reject) => { 
    const child = spawn(cmd, args, opts); 

    child.stdout.on('data', (data) => { 
     // use custom log function 
     opts.log(stringify(data)); 
    }); 

    child.stderr.on('data', (data) => { 
     // use custom error function 
     opts.error(stringify(data)); 
    }); 

    child.on('close', (code) => { 
     if (code === 0) { 
     resolve(); 
     } else { 
     reject(); 
     } 
    }); 
    }); 
}; 

這將導致以下錯誤:

​​

我在做什麼錯?

+0

你打電話給'spawnPromise'怎麼樣? –

回答

1

spawnPromiseoptsopts你在它上面已經聲明,這是你已經申報spawnPromise這裏的參數:

const spawnPromise = (cmd, args, opts) => { 
// ------------------------------^^^^ 

這個參數屏蔽了該模塊全局。 spawnPromise將使用您通過它的內容,而不是全局模塊。如果要使用模塊全局,請更改它的名稱或參數。

也許(見<===評論):

// define custom logger 
const defaultOpts = {       // <=== Change name 
    log: console.log, 
    error: console.error 
}; 

const spawnPromise = (cmd, args, opts) => { 
    opts = Object.assign({}, defaultOpts, opts); // <=== Expand with defaults 
    return new Promise((resolve, reject) => { 
    const child = spawn(cmd, args, opts); 

    child.stdout.on('data', (data) => { 
     // use custom log function 
     opts.log(stringify(data)); 
    }); 

    child.stderr.on('data', (data) => { 
     // use custom error function 
     opts.error(stringify(data)); 
    }); 

    child.on('close', (code) => { 
     if (code === 0) { 
     resolve(); 
     } else { 
     reject(); 
     } 
    }); 
    }); 
}; 

注意Object.assign會忽略它,如果optsnullundefined(而不是導致錯誤)。

隨着Stage 3 proposal,即Object.assign可以使用,而不是傳播:

opts = {...defaultOpts, ...opts}; 

在其目前的形式,它也還可以與optsnullundefined。但是,目前,分散性屬於第3階段。

0

您還沒有指定,在這裏,但你可能會調用spawnPromiseopts參數作爲比opts你在上面定義,或通過什麼都沒有到這樣的說法在你的函數調用,其他的一些東西,會使其不確定。

對於獨立模塊來說,當opts.log不是函數或者以其他顯式方式處理它時,拋出特定錯誤可能是一個好主意。