node怎么做同步的方法?
发布于 9 年前 作者 youwi 6505 次浏览 最后一次编辑是 8 年前 来自 问答

我要写一个方法给别人用, 是 http请求的,大致是这样

pub_get(url){ var out require(‘http’).get(rul,function(){ out=http结果 }) wait(异步结束) return out }

其实就是一个等待的过程 要高效的实现,把异步的方法做成同步的 补充: 官方提供fs.readFileSync() 和fs.readFile() 我们自己写一个同步的方法有这么难么?

17 回复

用promise库,其他无解

好好的异步不用?

无论从那条路走,nodejs总有绕不过去的坑

promise + co 自豪地采用 CNodeJS ionic

@yakczh 用人家的框架肯定是有现成的限制。无解。

@Antoni1883 co是非常轻量级的 实在不行可以自己看了修改 其次Promise不是库 而是规范你可以自己实现 他的问题也可以用类似promise和emitter的方式来解决 自豪地采用 CNodeJS ionic

@wenshiqi0 官方提供fs.readFileSync() 和fs.readFile() 我们自己写一个同步的方法有这么难么? 模仿写一个难么?

Generator node --harmony somefile.js

@youwi 不难的 用co和promise可以做 只是看上去还是不太一样 官方的我倒是没有看过源码 但估计底层是不一样的 不能一概而论 自豪地采用 CNodeJS ionic

你在选型阶段都选择了node 那么就一定会大量遇到异步 要想通过封装来完全消除异步不是不行 但是看上去也不会是完全的同步代码 现在很多的异步方案实际上仍然是callback的语法糖 所以外部要完完全全用同步的语法来 对于没有fiber和协程的node来说我个人认为是不可能的 自豪地采用 CNodeJS ionic

如果能允许*和yield的话 就可以考虑generator了 也就是co库 自豪地采用 CNodeJS ionic

  1. 事件
  2. promise
  3. es7 async/wait (babel)

@wenshiqi0 node v12.0.1 版本是不是不支持呀! 然后用了 node --harmay 运行也不行…

*和yield的CO库

为什么nodejs不搞象golang那样的channel呢?

@youwi 你就直接用iojs就可以了 反正iojs和node也重新合并了 iojs对es6的支持更好 如果你加了co没有报错 只是结果不对 那就是你用错了 自豪地采用 CNodeJS ionic

@yakczh 因为作者坚持走异步io的路线 压根不准备弄协程 自豪地采用 CNodeJS ionic

npm install -g xd-synchttp

安装完成后,示例代码如下。

const sync = require('xd-synchttp');
let content = "";
try{
    content = sync.http_get('http://www.csdn.net',0);//0为不超时,其他数值为超时秒数
}
catch(err){
console.log(err);
}
回到顶部