Native Support for Promises in Node.js

前端 未结 8 635
陌清茗
陌清茗 2020-12-13 23:29

Is there native support for promises in current versions of Node.js?

Node.js uses the V8 engine. This JavaScript engine is also used by Chrome, and Chrome 32 has na

相关标签:
8条回答
  • 2020-12-13 23:57

    If node is using the same or later version of V8 that Chrome 32 uses then it is likely natively supported. Otherwise you will need to load 'es6-shim' (I recommend loading es5-shim first) I have no idea which version of V8 the current release of node is using.

    On my node install

    node --version
    v0.10.24
    
    node -e 'console.log(process.versions.v8);'
    3.14.5.9
    

    What version is Chrome V32 using? (I am using Chromium v27), so would have to find documentation, but possibly 3.22.24.16

    Looking in chrome://version/ seems to give the information

    Chromium    27.0.1453.93 (Developer Build 200836) Built from source for Fedora release 19 (Schrödinger’s Cat)
    OS  Linux 
    WebKit  537.36 (Unknown URL@0)
    JavaScript  V8 3.17.6.14
    Flash   11.2 r202
    User Agent  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36
    Command Line     /usr/lib64/chromium-browser/chromium-browser --enable-plugins --enable-extensions --enable-user-scripts --enable-printing --enable-sync --auto-ssl-client-auth --flag-switches-begin --enable-sync-favicons --enable-full-history-sync --sync-keystore-encryption --flag-switches-end
    Executable Path /usr/lib64/chromium-browser/chromium-browser
    Profile Path    /home/graham/.config/chromium/Profile 1
    Variations  b03ddc1f-2d9ef0cc
    f9b252d0-fd526c81
    ff3fc1a6-766fa2d
    7f6da4bf-70d6abf1
    75f7fb7e-611a9f49
    262f996f-42d3ce07
    24dca50e-455c9cca
    ca65a9fe-91ac3782
    3028188e-626278e
    5e29d81-cf4f6ead
    246fb659-6754d7b7
    f296190c-72d8285f
    4442aae2-4ad60575
    75f0f0a0-a5822863
    e2b18481-6e3b1976
    e7e71889-e1cc0f14
    

    And now from a Chrome install

    Google Chrome   32.0.1700.107 (Official Build 248368) 
    OS  Linux 
    Blink   537.36 (@165586)
    JavaScript  V8 3.22.24.17
    Flash   12.0.0.44
    User Agent  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
    Command Line     /usr/bin/google-chrome-stable --flag-switches-begin --flag-switches-end
    Executable Path /opt/google/chrome/google-chrome
    Profile Path    /home/graham/.config/google-chrome/Default
    Variations  b178bdde-887f97ea
    24dca50e-837c4893
    8d790604-9cb2a91c
    5a3c10b5-e1cc0f14
    244ca1ac-4ad60575
    5e29d81-cf4f6ead
    3ac60855-486e2a9c
    246fb659-bd104136
    f296190c-38939ee9
    4442aae2-6e597ede
    ed1d377-e1cc0f14
    75f0f0a0-e1cc0f14
    e2b18481-6e597ede
    e7e71889-4ad60575
    
    0 讨论(0)
  • 2020-12-13 23:59

    you will need to have newest V8 version - try compiling from master branch - there you will find V8 version 3.25.30 with Promises

    quick comparison with standard Q:

    Q>resolve>then 100k times:
    real    0m7.459s
    user    0m7.121s
    sys     0m0.346s
    
    V8 Promose>resolve>then 100k times:
    real    0m0.980s
    user    0m0.884s
    sys     0m0.097s
    
    0 讨论(0)
  • 2020-12-14 00:02

    It looks like v0.12 supports promises, see node.Promise.

    0 讨论(0)
  • 2020-12-14 00:05

    I tried Node v0.11.12 with the --harmony flag, and it does not have native promises.

    v0.11.13 and later with the --harmony flag does have Promise.

    0 讨论(0)
  • 2020-12-14 00:08

    It is important to point out that the accepted answer for this question is using a promise library which is not syntactically identical to the native JS promise feature as defined by the Promises/A+ spec.

    If you want Node to, as closely as possible, mimic the browser then you should use the es6-promise module located at https://github.com/jakearchibald/es6-promise.

    npm install es6-promise

    var Promise = require("es6-promise").Promise

    Technical Differences:

    One key difference in the module is in the very constructor: var foo = new Promise() is not valid in your browser, as the Promise constructor requires a function to initialize, and that function will be responsible for resolving or rejecting that promise. In the node-promises module, resolve is accessible to all users of the Promise, which breaks the encasuplation of the Promise.

    Example using node-promises

    var foo = new Promise() 
    // no encapsulation, now anyone you pass this promise to can resolve it with whatever they want.
    

    Example using es6-promises

    var foo = new Promise(function(resolve, reject) { resolve("foo") }) 
    // encapsulation, no one is able to resolve this Promise but the originator of that Promise.
    

    If you desire the ability to publically expose the resolve/reject capabilities you'll need to unfold the promise, example here.

    0 讨论(0)
  • 2020-12-14 00:13

    Although Node.js added native promise in stable version 0.12.

    But due to the memory leak issue, I recommend to use bluebird to avoid the issue.

    • https://github.com/promises-aplus/promises-spec/issues/179
    • https://github.com/tj/co/issues/180

    Old anwser:

    Node.js added native promise support since version 0.11.13.

    nvm install 0.11.12
    nvm run 0.11.12
    > Promise
    ReferenceError: Promise is not defined
    > console.log(process.versions.v8)
    3.22.24.19
    
    nvm install 0.11.13
    nvm run 0.11.13
    > Promise
    [Function: Promise]
    > console.log(process.versions.v8)
    3.25.30
    

    Note: Node.js v0.11 is still in beta, be careful if use it in production.

    0 讨论(0)
提交回复
热议问题