我正在导入异步功能并尝试使用它

时间:2018-12-03 10:50:47

标签: node.js asynchronous promise

以下是我读取数据的异步函数

const fs = require('fs');

module.exports = {

    foo: async () => {
        const a = async () => {
            filedata = await fs.readFile('./scripts/pairs.json');
            console.log(filedata);
        }
        a()
    }
}

我正在导入第二个文件中的数据,并尝试使用setTimeout尝试,但失败了

  

var a = require('./ scripts / 2_fundAccounts')

app.get('/createaccount',(req,res) =>{
     console.log(setTimeout(()=>a.foo().then((i)=> console.log(i)),5000));
})

我收到超时错误

超时{   _称为:错误,   _idleTimeout:5000,   _idlePrev:

接下来,我删除了setTimout并尝试使用,然后我变得不确定

app.get('/createaccount', (req, res) => {
    console.log(a.foo().then((i) => console.log(i)))
})

接下来,我更改了2_fundaccounts代码

  

等待a()

我知道了

Server is listing on port 3000
Promise { <pending> }
(node:18637) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
undefined

1)任何获得承诺的建议都会得到解决,而不会出现任何错误

2)请帮助我,我不想更改我没有赖特的2_fundacounts代码

3)如果我必须更改2_fundaccounts,请告诉我该怎么做以及如何做

3 个答案:

答案 0 :(得分:4)

您使用fs错误。它的方法是异步的,但它们基于回调。您的代码应类似于:

foo() {
    return new Promise((resolve, reject) => {
        fs.readFile('./scripts/pairs.json', (err, filedata) => {
            if (err) {
                reject(err);
            } else {
                resolve(filedata);
                console.log(filedata);
            }
        });
    });
}

但是,如果您使用的是Node 10或更高版本,则导入require('fs').promises可使您将其方法用作典型的异步函数:

const fs = require('fs').promises;

module.exports = {
    foo: async () => {
        const filedata = await fs.readFile('./scripts/pairs.json');
        console.log(filedata);
        return filedata;
    }
}

答案 1 :(得分:0)

当您这样调用“ a”函数时,需要使用“ await”。

module.exports =  {

    foo: async () => {
        const a = async() =>  {
            filedata = await fs.readFile('./scripts/pairs.json');
            console.log(filedata);
        }
        await a()
    }
}

答案 2 :(得分:-1)

错误来自fs.readFile,此方法将回调作为第二个参数。如果要使其同步,可以使用如下所示的readFileSync:

filedata = fs.readFileSync('./scripts/pairs.json');

最后,您的程序正在打印未定义的内容,因为您没有向foo函数返回任何内容,因此'i'没有任何内容。