V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zgoing
V2EX  ›  Node.js

node 新手,请问怎么在一个函数里等 promise 执行了 resolve() 之后才返回呢

  •  
  •   zgoing · 2017-02-09 17:58:54 +08:00 · 3027 次点击
    这是一个创建于 2833 天前的主题,其中的信息可能已经有所发展或是发生改变。
    13 条回复    2017-04-07 00:20:12 +08:00
    scarlex
        1
    scarlex  
       2017-02-09 18:00:06 +08:00   ❤️ 1
    直接返回 promise
    believeitcould
        2
    believeitcould  
       2017-02-09 18:07:59 +08:00
    es7 async await
    yiyizym
        3
    yiyizym  
       2017-02-09 18:11:23 +08:00
    这不就是同步执行么?

    还用什么 Promise ?
    finian
        4
    finian  
       2017-02-09 18:20:15 +08:00
    callback, promise, rx, async/await 任君选择
    owt5008137
        5
    owt5008137  
       2017-02-09 18:25:42 +08:00 via Android
    好像只能回调,或者看下是否已支持 await
    zgoing
        6
    zgoing  
    OP
       2017-02-09 19:00:48 +08:00
    @yiyizym
    @finian
    @owt5008137

    正在练手 koa ,用了 npm 里一个 google translate 的包,它返回的就是一个 promise ,我想把这个 promise 的结果传给 koa 路由,然后就不知道了。。。
    rogerchen
        7
    rogerchen  
       2017-02-09 19:12:26 +08:00
    promise 不是有 then 么,把后续逻辑写在 then 里边不就好了, poorman's await 。
    abramstyle
        8
    abramstyle  
       2017-02-09 19:27:22 +08:00
    路由就是 async 的,或者如果是 koa 1 那么就是 generator ,都支持异步。

    给你个例子吧:

    比如这个 controller :

    koa1:
    ```js
    a: function() * {
    const result = yield fetchTranslate();

    this.data = result;
    }
    ```

    koa 2:

    ```js
    async a(ctx, next) {
    const result = await fetchTranslate();

    ctx.data = result;
    }
    ```

    没测试,可能有语法错误,大概就是这么个意思。
    Jeepeng
        9
    Jeepeng  
       2017-02-09 19:48:57 +08:00
    function fn() {
    return new Promise((resolve, reject) => {
    // do something
    resolve()
    })
    }
    Sparetire
        10
    Sparetire  
       2017-02-10 01:22:18 +08:00 via Android
    异步是会传染的,最好 async 其次 co+generator ,或者把这个函数也 promise 化返回,最次 callback
    zgoing
        11
    zgoing  
    OP
       2017-02-10 08:13:12 +08:00
    @abramstyle 非常感谢,你的代码解决了我的问题。可是我还是没有弄懂 koa 为什么会自动执行 promise 里的 resolve(),希望能帮帮我,谢谢
    abramstyle
        12
    abramstyle  
       2017-02-10 09:53:13 +08:00   ❤️ 1
    因为 async 会创建一个异步函数,这时候如果在 promise 前加上 await 那么就会等待这个 promise 完成再继续执行。
    generator 同理。不过 generator 先出现,但是因为 async/await 是 ES7 的东西,所以大家都跳过 generator 直接用上了 async/await.

    这两个概念理解起来可能有点费劲,具体你可以找一些文章来学习一下 async/await 和 generator 。比如 https://ponyfoo.com/articles/understanding-javascript-async-await
    libook
        13
    libook  
       2017-04-07 00:20:12 +08:00
    函数里不能等 promise resolve 之后再返回,但是可以在 resolve 执行之前返回这个 promise 对象,让调用这个函数的程序拿到返回的 promise 再调用其 then 等方法拿到回调函数。
    ```javascript
    function f() {
    return new Promise((resolve, reject) => {
    // 做其他事
    resolve();
    }) ;
    }

    let thePromise=f();// 这一句是执行 f 函数,返回了一个 Promise 对象,复制给 thePromise 变量
    thePromise.then(function(){
    // 这里就是在 f 函数的 resolve 执行完之后才执行的程序。
    });
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1515 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.