首页   注册   登录
 cloudzqy 最近的时间轴更新

cloudzqy

  •   V2EX 第 195203 号会员,加入于 2016-10-09 14:00:15 +08:00,今日活跃度排名 4267
    cloudzqy 最近回复了
    3 天前
    回复了 renjuntao 创建的主题 问与答 关于征信网站的密码输入插件
    家里 ie 坏了,用 360 急速进去,查完,然后再卸载。
    4 天前
    回复了 Reign 创建的主题 程序员 为了眼睛,有没有必要买投影仪写代码?
    主要是灯光反光,太伤眼睛了
    电话开锁服务,你家防盗门,一分钟就弄开了,何必那么复杂呢,学一手开锁技术多好。
    20 天前
    回复了 lekuhu 创建的主题 问与答 像这样自适应的网站利于 SEO 吗
    自适应一般是用 css 吧,seo 只爬 html
    可以试试知识星球变现
    20 天前
    回复了 Srar 创建的主题 分享创造 基于 TypeScript 实现的开源 SSTap
    赶紧收藏
    @waibunleung
    你说的能,是因为后面的中间件没有异步,而后端代码有异步才是普遍情况,假如有异步:
    1. 使用 await next()会等你后面的中间件的异步全部执行完,再执行 next()后面的代码:
    >>one
    ...其他中间件,包含同步和异步...
    <<one
    2. 而不使用 await 的情况,执行顺序是:
    >>one
    ...其他中间件的同步...
    <<one
    其他中间件的异步

    我需要的是最外层的>>one 最先执行,然后<<one 最后执行,2 的输出不符合模型
    @waibunleung
    先考虑目的:实现洋葱模型,这是 koa 基本思想,理由够充分,可以从阮一峰的例子了解这个模型。
    然后再考虑方式,用 async。如果不返回 promise,不用 async,当有中间件用异步的时候,无法实现洋葱模型,如例 2。或者你可以自己试试?
    当然,回调,promise,generator,async 都可以实现,但是 async 更优雅。
    看了几遍才看懂你的疑问,其实光看阮一峰这个例子好有误导性呀。
    “迄今为止,所有例子的中间件都是同步的,不包含异步操作。如果有异步操作(比如读取数据库),中间件就必须写成 async 函数。”
    只要有一个是异步的,如果要保持这个例子的输出,就必须要用 async 和 await。

    假如这个例子只有 one 和 two,把 two 换成异步
    例一
    ```
    const one = (ctx, next) => {
    console.log('>> one');
    next();
    console.log('<< one');
    }
    const two = (ctx, next) => {
    console.log('>> two');
    setTimemout(() => {
    next();
    console.log('<< two');
    });
    }
    ```
    你这个时候输出的将会是 >> one >> two <<one <<two。
    然而中间件希望的输出是 >> one >> two << two << one。
    所以你需要
    例二
    ```
    const one = async (ctx, next) => {
    console.log('>> one');
    await next();
    console.log('<< one');
    }
    const two = (ctx, next) => {
    console.log('>> two');
    setTimemout(() => {
    next();
    console.log('<< two');
    });
    }
    ```
    这就是为什么 next 要返回 promise。只有全部 promise 才能达到你预期的状态。
    三个问题一起解答,当你期望的执行顺序是例一的时候可以不用 async,这样比较混乱,因为你不知道你后面的中间件有多少异步多少同步,无法预测执行顺序,所以 koa 的中间件思想就是例二这种,不管 two 是不是异步,执行顺序都不会变。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1921 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 9ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1