XMLHttpRequest с наблюдаемым в Typescript

у меня проблема tslint, когда я пытаюсь управлять результатом вызова XMLHttpRequest, который я делаю для загрузки файлов. Вот мой текущий метод, который я нашел в интернете:

// Files upload request
makeFileRequest(url: string, files: Array<File>) {
    return new Promise((resolve, reject) => {
        let formData: any = new FormData()
        let xhr = new XMLHttpRequest()
        for(let file of files) {
            formData.append("uploads[]", file, file.name)
        }
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    resolve(JSON.parse(xhr.response))
                } else {
                    reject(xhr.response)
                }
            }
        }
        xhr.open("POST", url, true)
        xhr.send(formData)
    })
}

Так что это работает, файлы загружаются, и бэкэнд отвечает на ответ 200. Но в методе, где я использую эту функцию, я делаю это :

        this.makeFileRequest("theurl", this.listFiles)
        .map(res => res.json())
            .subscribe(
                res => console.log(res),
                error => console.log("fails")
            )

но tslint говорит мне это в точке карты:

TS2339 Property 'map' does not exist on type 'Promise<{}>'.

поэтому я думаю, что было бы лучше управлять makeFileRequest функция таким образом, она возвращает наблюдаемое вместо обещания. И на всякий случай, обратите внимание, что я импортирую "rxjs / add / operator / map".

кто-нибудь какие-нибудь идеи ? Спасибо !

1 ответов


map метод Observable, а не Promise. Возвращение Observable исправить ошибки:

makeFileRequest(url: string, files: Array<File>) {
    return Observable.fromPromise(new Promise((resolve, reject) => {
        let formData: any = new FormData()
        let xhr = new XMLHttpRequest()
        for (let file of files) {
            formData.append("uploads[]", file, file.name)
        }
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    resolve(JSON.parse(xhr.response))
                } else {
                    reject(xhr.response)
                }
            }
        }
        xhr.open("POST", url, true)
        xhr.send(formData)
    }));
}

решение для ошибки:

Property 'json' does not exist on type '{}'

https://stackoverflow.com/a/33919897

не забудьте импортировать Response:

import {Response} from '@angular/http';