2017-06-06 66 views
0

我收到一個未解決的Promise。Node.js中的未解決Promise問題

我有這樣的功能:

export async function readData(dir) { 
await fs.readFile(dir, `utf-8`, (err, data) => { 
    if (err) throw err 
    console.log("data1:", data) 
    return data 
}) 
} 

我敢從這個函數調用:

app.get('/server/survey', (ctx) => { 
let dir = path.join(__dirname, 'src/DB/index.json') 
let data = funcs.readData(dir) 
data.then((result) => { 
    console.log("Content:", result) 
    ctx.body = `${result}` 
}) 

第一個正確註銷的數據,但第二註銷一個懸而未決的承諾。

回答

0

fs.readFile()不返回承諾,所以你不能await就可以了。

您有手動承諾把它包起來:使用節點V8的util.promisify

export function readData(dir) { 
    return new Promise((resolve, reject) => { 
    fs.readFile(dir, `utf-8`, (err, data) => { 
     if (err) return reject(err); 
     console.log("data1:", data); 
     return resolve(data); 
    }) 
    }); 
} 

或者promisify fs.readFile,例如:

const util  = require('util'); 
const fs  = require('fs'); 
const readFile = util.promisify(fs.readFile); 

async function readData(dir) { 
    let data = await readFile(dir, `utf-8`); 
    console.log("data1:", data) 
    return data; 
} 

而不是使用節點V8的,你也可以使用一個像bluebird這樣的庫提供promisification。

請注意await示例回調未被使用。

+0

工作表示感謝。應該嘗試過。剛剛採用了上面的手動承諾方法。謝謝! – Fedreg

+0

@Fedreg我忘了提及['pify'](https://github.com/sindresorhus/pify),這是一個不錯的小型庫,可以提升基於回調的函數:) – robertklep

+0

我會看看它。再次感謝! – Fedreg