2015-09-05 45 views
40

Czytam this SO question, ale mam problem z uzyskaniem obietnic pracy z maszynopisem. Mamy nadzieję, że uda nam się stworzyć przejrzysty przewodnik. To jest dla projektu serwer/węzeł. W rzeczywistości używam najnowszego rozwiązania iojs, ale kieruję reklamy na ES5 jako wynik.jak korzystać z obietnic es6 z maszynopis?

$ 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; 
} 

to daje błąd:

Cannot find name 'Promise'. 

// alternatywnie:

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


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

Jaki jest zalecany sposób, aby powrócić obietnicę z własnego serwera węzeł kodu po stronie?

odniesienia:

Odpowiedz

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

wspaniała i szczegółowa odpowiedź, wielkie dzięki! – dcsan

+2

Czy obecnie zaleca się używanie 'typings' zamiast' tsd'? –

+5

Uwaga dla osób używających Angular 2: nie potrzebujesz (i nie powinieneś używać) instrukcji import {Promise}, nie potrzebujesz es6-promise.d.ts, ponieważ jest ona dołączona do frameworka Angular 2 (jako wersji beta 15). –

10

następuje to na V2.1.1 + z celem ustawiony es5

mi było użyć Promises z async/await instalując es6-promise, a następnie dodanie tego na początku pliku:

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

A to do tsconfig.json

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

pomocą formularza import { Promise } nie działa na mnie jak inne biblioteki upaść (np Axios)

1

Dodaj poniższe linie do package.json:

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

Jeśli mogę to zrobić, muszę importować 'Promise' czy mogę po prostu używać go ? –

3

Musiałem PolyFill to w dla innej ramy (w szczególności Axios); Nie musiałem tworzyć własnych obietnic, więc żadne z tych rozwiązań nie zadziałało.Na szczęście odpowiedź była prosta, jeśli dobrze ukryta:

import { polyfill } from 'es6-promise' 

polyfill(); 
+0

Bardzo spóźniona reakcja, ale chciałem po prostu zadzwonić, że twój był osobiście moim podejściem. TS 2.7.2 bez żadnych innych frameworków (np. Bez Angular), obietnica es6, a następnie 'polyfill()' był * najprostszym * sposobem na wsparcie IE11. Dzięki. – mschofield