2015-09-05 2 views
40

Ho letto this SO question ma ho difficoltà a ottenere promesse di lavorare con dattiloscritto. Speriamo di poter fare una guida chiara. Questo è per un progetto server/nodo. In realtà sto usando gli ultimi iojs, ma ho scelto come destinazione l'ES5.come usare es6-promette con dattiloscritto?

$ tsd query es6-promise --action install --save 
$ npm install --save es6-promise 


// typescript code: 

/// <reference path="../../typings/es6-promise/es6-promise.d.ts"/> 

var Promise = require("es6-promise").Promise; 
require('es6-promise').polyfill(); 

function test():Promise { 
    var p:Promise = new Promise(); 
    return p; 
} 

questo sta dando l'errore:

Cannot find name 'Promise'. 

// in alternativa:

var p = new Promise<string>((resolve, reject) => { 
    resolve('a string'); 
}); 


//error=> Untyped function calls may not accept type arguments. 

Qual è il metodo consigliato per restituire una promessa dal codice lato server nodo propria?

riferimenti:

risposta

45

main.ts

import {Promise} from 'es6-promise'; 
const p: Promise<string> = new Promise (
    (resolve: (str: string)=>void, reject: (str: string)=>void) => { 
     const a: string = "hello from Promise"; 
     resolve(a); 
    } 
); 
p.then((st) => { 
    console.log(st); 
}); 

tsconfig.json

{ 
    "compilerOptions": { 
     "target": "es3", 
     "module": "commonjs", 
     "declaration": false, 
     "noImplicitAny": false, 
     "noLib": false 
    }, 
    "filesGlob": [ 
     "./**/*.ts", 
     "!./node_modules/**/*.ts" 
    ], 
    "files": [ 
     "./main.ts", 
     "./typings/es6-promise/es6-promise.d.ts" 
    ] 
} 

compileandrun.sh

#!/bin/sh 
npm install es6-promise 
tsd install es6-promise 
tsc 
node main.js 
+0

risposta grande e dettagliata, grazie mille! – dcsan

+2

Si consiglia ora di usare 'typings' piuttosto che' tsd'? –

+5

Nota per coloro che utilizzano Angular 2: non è necessario (e non deve essere utilizzato) l'istruzione import {Promise}, non è necessario es6-promise.d.ts, poiché viene fornito in bundle con il framework Angular 2 (come di beta 15, comunque). –

10

Di seguito era in v2.1.1 + con l'obiettivo fissato a es5

ho potuto utilizzare promesse con async/await installando es6-promise e poi aggiungendo questo all'inizio del file:

global.Promise = require('es6-promise').Promise; 

E questo a tsconfig.json

"lib": [ "es2015.promise", "es5" ], 

Utilizzando il modulo di import { Promise } non ha funzionato per me, come altre biblioteche si schiantavano (es: Axios)

1

Aggiungere il seguente alla package.json:

"devDependencies": { 
"@types/es6-promise": "^0.0.32" 
}, 
"dependencies": { 
"es6-promise": "~4.1.0" 
} 
+0

Se faccio questo, devo importare 'Promise' o posso semplicemente usarlo ? –

3

avevo bisogno di ovatta questo in un quadro diverso (in particolare, Axios); Non avevo bisogno di creare realmente le mie promesse, quindi nessuna di queste soluzioni ha funzionato per me.Fortunatamente, la risposta è stata semplice, se ben nascosta:

import { polyfill } from 'es6-promise' 

polyfill(); 
+0

Risposta super tardiva, ma volevo solo far capire che il tuo era il mio approccio personale. TS 2.7.2 senza altri framework (ad es., Nessun Angular), la promessa es6 e quindi 'polyfill()' era il modo * più semplice * per supportare IE11. Grazie. – mschofield