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

2019-05-17 18:52:18 +08:00
 petelin

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 异步化也可以很好看

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

1590 次点击
所在节点    问与答
7 条回复
Sparetire
2019-05-17 18:54:12 +08:00
async/await
Cryse
2019-05-17 18:56:36 +08:00
async await
另外这单个字母的变量看着就蛋疼
petelin
2019-05-17 19:11:37 +08:00
看到了曙光
@Sparetire
@Cryse

另外好像 then 可以链式调用不需要 每一层都写里面....
mcfog
2019-05-17 19:29:11 +08:00
1. go 的 if err 一般而言很难算在“正常的语言”范畴中
2. 你的逻辑没理清楚,go 的也好什么别的语言也好写出来的一样也是面条代码 (确实 nodejs 的面条比别家更恶臭一点)
3.
Promise.all( [findCompany({name:'KFC'}, createJob(input)] )
.then( ([company, job]) => attachJobToCompany(company, job) )
.catch( handleErr )
fortunezhang
2019-05-17 23:20:53 +08:00
兄弟,你没有拆分好逻辑。
另外你可以用 await async,最近我把项目里面能用的都用了,感觉还不错。
Magentaize
2019-05-18 06:44:26 +08:00
代码之光 await
xiadong1994
2019-05-18 09:40:48 +08:00
then 里面可以 return 一个 promise 然后在外面一层继续 then/catch。promise 里面的错误可以 throw 然后在外面 catch 然后继续 then ……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/565168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX