V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
petelin
V2EX  ›  问与答

有没有高手能师范一下 nodejs 怎么写代码?

  •  
  •   petelin · 2019-05-17 18:52:18 +08:00 · 1657 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    nodejs 因为要异步所以总是把方法传来传去. 比如这段代码

    model.Company.findOne({"name": "KFC"}).then(function (c) {
        console.log("success get company", c);
        let j = new model.Job(
            {
                title: "title",
                position: "position",
                category: "A",
                description: "description",
                location: "location",
                workType: "B",
                salary: "100",
            }
        );
        j.save().then(function (j) {
            console.log("success save job", j);
            c.addToJob(j).save().then(function (c) {
                console.log("success add to job")
            }, err => console.error("save job after company", err));
        }, err => console.error("save job", err))
    }, function (err) {
        if (err) console.error.bind(console, "find company error");
    });
    

    如果是正常的语言就会很简单

    c,err = find()
    if err {}
    
    err = c.add()
    if err {}
    
    job = ...
    job.save()
    
    c.add(job)
    

    哪怕加上 groutine 异步化也可以很好看

    有没有大佬能教教怎么改这段代码?

    7 条回复    2019-05-18 09:40:48 +08:00
    Sparetire
        1
    Sparetire  
       2019-05-17 18:54:12 +08:00 via Android   ❤️ 1
    async/await
    Cryse
        2
    Cryse  
       2019-05-17 18:56:36 +08:00
    async await
    另外这单个字母的变量看着就蛋疼
    petelin
        3
    petelin  
    OP
       2019-05-17 19:11:37 +08:00
    看到了曙光
    @Sparetire
    @Cryse

    另外好像 then 可以链式调用不需要 每一层都写里面....
    mcfog
        4
    mcfog  
       2019-05-17 19:29:11 +08:00   ❤️ 1
    1. go 的 if err 一般而言很难算在“正常的语言”范畴中
    2. 你的逻辑没理清楚,go 的也好什么别的语言也好写出来的一样也是面条代码 (确实 nodejs 的面条比别家更恶臭一点)
    3.
    Promise.all( [findCompany({name:'KFC'}, createJob(input)] )
    .then( ([company, job]) => attachJobToCompany(company, job) )
    .catch( handleErr )
    fortunezhang
        5
    fortunezhang  
       2019-05-17 23:20:53 +08:00   ❤️ 1
    兄弟,你没有拆分好逻辑。
    另外你可以用 await async,最近我把项目里面能用的都用了,感觉还不错。
    Magentaize
        6
    Magentaize  
       2019-05-18 06:44:26 +08:00 via iPhone
    代码之光 await
    xiadong1994
        7
    xiadong1994  
       2019-05-18 09:40:48 +08:00 via iPhone   ❤️ 1
    then 里面可以 return 一个 promise 然后在外面一层继续 then/catch。promise 里面的错误可以 throw 然后在外面 catch 然后继续 then ……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:35 · PVG 01:35 · LAX 09:35 · JFK 12:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.