nodejs如何从异步回调函数返回想要的值

const fs = require(‘fs‘)

let read=()=>{
    fs.readFile("./contents/test.json",(err,data)=>{
        return JSON.parse(data.toString())
    })
}

(()=>{
    let result = read()
    console.log(result)  //undefind
})()

我们想从一个回调函数返回一个我们想要的值,如果按照上面的写法我们始终只能拿到undefind。

解决的办法也很简单,如下。

const fs = require(‘fs‘)

let read=async ()=>{
    return new Promise((resolve,reject)=>{
        fs.readFile("./contents/test.json",(err,data)=>{
            if(err) reject(err)
            resolve(JSON.parse(data.toString()))
        })
    })

}

(async ()=>{
    let result =await read()
    console.log(result)    //{msg:"ok"}
})()

顺便把异步的问题也解决了。

原文地址:https://www.cnblogs.com/BlackFungus/p/12329550.html

时间: 2024-11-01 11:16:19

nodejs如何从异步回调函数返回想要的值的相关文章

同步异步 + 回调函数

重点记忆 异步回调函数 如果进程池+回调: 回调函数由主进程去执行. 如果线程池+回调: 回到函数由空闲的线程去执行.(比如有4个线程,10个任务,第一轮完成4个任务,交由主线程处理结果,第二轮同样如此,但是第三轮将会空闲出2个子进程,则这2个子进程将会和主进程一同处理结果,以此类推,当所有的任务完成时,所有的子进程和主进程一起处理结果,增加效率) 回调函数不管有没有返回数据,返回值都是None,回调函数内部加函数名是调用此函数,obj隐形传参 1.概念 1. 从执行的角度 阻塞: 程序运行时,

2015/01/23 – 不要对异步回调函数进行同步调用

绝对不能对异步回调函数(即使在数据已经就绪)进行同步调用. 如果对异步回调函数进行同步调用的话,处理顺序可能会与预期不符,可能带来意料之外的后果. 对异步回调函数进行同步调用,还可能导致栈溢出或异常处理错乱等问题. 如果想在将来某时刻调用异步回调函数的话,可以使用 setTimeout 等异步API. function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' || re

获取$.post $.get回调函数返回值问题

原文地址:http://wangzhipeng0713.blog.163.com/blog/static/1944751652014220111741183/ 项目中用Jquery操作,肯定避免不了向服务器发送请求,所以就会用到上面的两个函数.完整的函数格式如下: $.get(URL,callback); $.post(URL,data,callback); 而某些时候我们要用callback回调函数处理完以后的返回值,常规的思路是定义一个全局变量来接收返回值,然后在$post的外面,函数的里面

协程,事件,队列,同步,异步,回调函数

协程 什么是协成?单个线程并发的处理多个任务,程序控制协成的切换+保持状态,协成的切换速度非常快,蒙蔽了操作系统的眼睛,让操作系统认为CPU一直在运行 进程或线程都是由操作系统控制CPU来回切换,遇到阻塞就切换执行其他任务,协成是程序控制的,霸占CPU执行任务,会在操作系统控制CPU之前来回切换,操作系统就认为CPU一直在运作 协程的优点: 1.开销小 2.运行速度快 3.协程会长期霸占CPU只执行我程序里的所有任务 协程的缺点: 1.协程属于微并发,处理任务不易过多 2.协程的本质是单线程,无

Python函数返回不定数量的值

Python的函数是可以return多个值的,但其本质上还是返回单个值,只是利用了tuple的自动打包,将多个值打包成单个tuple返回. 使用代码验证: def func_a(): return 1, 2, 3, 4 if __name__ == '__main__': temp = func_a() print(type(temp)) 运行结果,确认返回的是一个tuple, <class 'tuple'> 稍微修改代码: def func_a(*args): return 1, 2, 3,

C#的异步回调函数

关于C#的异步回调,在ActionScript 3.0当中 , 有关键字Function , 可以直接传class函数为回调函数.但是在C#当中,需要使用到委托,其中应用的最多的当属 : Action / Func .当然你可以使用关键字delegate来自定义委托.这里翼Action /  Func为例来讲解C#的异步回调,如果不了解C#的委托机制,需要自己先百度/Google一下,再来看这篇博客. BeginInvoke 方法用于启动异步调用.它与您需要异步执行的方法具有相同的参数,只不过还

nodejs中的异步回调机制

1.再次clear Timer定时器的作用 setTimeOut绝非是传统意义上的"sleep"功能,它做不到让主线程"熄火"指定时间,它是用来指定:某个回调在固定时间后插入执行栈!(实际执行时间略长于这个固定时间) 2.js或nodejs想"sleep"主线程怎么做? 可以自定义sleep休眠函数,原理就是 目标时间 >= 当前时间+sleepTime; 然后不断在while中tick时间.比较.直接看代码吧. function slee

如何优雅的处理Nodejs中的异步回调

前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); }); 那,我们读取两个文件,将这两个文件的内

python 管道 事件 信号量 进程池(map/同步/异步)回调函数

####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的时候 需要子执行某个进程后 需要的返回值时 可以使用 信号量:互斥锁同时只允许一个线程更改数据,而信号量Semaphore是同时允许一定数量的线程更改数据 . 内部维护了一个计数器,acquire-1,release+1,为0的时候,其他的进程都要在acquire之前等待 进程池:  进程的创建和销