zoukankan      html  css  js  c++  java
  • nodejs 代码设计模式1:同步函数变异步

    同步函数变异步

    1 问题:

    1.1 碰到需要调用你刚正在创建的对像。

    function createServer(data, cb) {
        data.num = 1;
        cb();
        return data;
    }
    
    const test = {};
    let data = createServer(test, function() {
        console.log(data.num);// 调用你创建的对像
    });
    
    

    这时会报错Cannot read property 'num' of undefined

    因为回调函数调用时data对象还没有赋值,所以会报错。

    1.2 自己写函数时,需要一个回调函数,你希望是异步,但是实际是同步。

    
    function foo(s,cb){
      console.log(s);
      cb();
    }
    
    foo("run1",function() {
      console.log("callback");// 你希望这里的函数异步,在run后面输出,实际上这里在还是同步,没有达到效果。
    })
    
    console.log("run2");
    
    
    
    

    2 解决方案

    在nodejs中创一个异步的函数的调用方法有三种: setTimeout,setImmediate,process.nextTick

    第一个问题解决方案:

    function createServer(data, cb) {
        data.num = 1;
        process.nextTick(cb);
        // or setImmediate(cb);
        // or setTimeout(()=> cb(),0);
        return data;
    }
    
    const test = {};
    let data = createServer(test, function() {
        console.log(data.num);// 调用你创建的对像
    });
    
    
    

    第二个问题解决方案:

    function foo(s,cb){
      console.log(s);
      process.nextTick(cb);
      // or setImmediate(cb);
      // or setTimeout(()=> cb(),0);
    }
    
    foo("run1",function() {
      console.log("callback");// 你希望这里的函数异步,在run后面输出,实际上这里在还是同步,没有达到效果。
    })
    
    console.log("run2");
    
    

    3 总结

    在nodejs中,就三个方法可以使调用变成异步: setTimeout,setImmediate,process.nextTick,你直接使用process.nextTick就没有问题。

  • 相关阅读:
    HDU3247 Resource Archiver(AC自动机+BFS+DP)
    POJ2486 Apple Tree(树形DP)
    POJ1699 Best Sequence(AC自动机+状压DP)
    SPOJ287 Smart Network Administrator(最大流)
    POJ3189 Steady Cow Assignment(最大流)
    ZOJ2332 Gems(最大流)
    COGS731 [网络流24题] 最长递增子序列(最大流)
    POJ1947 Rebuilding Roads(树形DP)
    POJ1135 Domino Effect(SPFA)
    SPOJ962 Intergalactic Map(最大流)
  • 原文地址:https://www.cnblogs.com/htoooth/p/5491288.html
Copyright © 2011-2022 走看看