2017-06-06 67 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