fetch 取代 ajax、xmlHttpRequest的好東西
fetch是chrome 43版有的新功能
他是使用Promise去達成async的方法
可惜nodejs中沒有支援fetch必須安裝第三方node-fetch去達成fetch的使用
P.S. 目前我用的7.7.3版依然沒有內建,request老實說已經不想用了
另外最近覺得蠻感動的是chrome 57支援async/await原生啦,不過目前專案的瀏覽器受限於OS只能用43...OTL
就來簡單介紹一下它的功能吧
fetch說道能夠取代xhr和jquery的ajax大概是他的code捨棄了使用callback function這種噁心的東西
改成了目前處理同步/異步最方便的Promise語法
我直接拉node-fetch的定義檔說明
後面很明顯的return出來的是Promise的物件,解構之後會得出來是一個Response的東西。
一般對我來說最常用的大概就是POST和GET
所以使用方式就是
如果用import * as fetch from 'node-fetch';
會出現
Cannot invoke an expression whose type lacks a call signature.
這行錯誤,就像我文中那樣進行宣告就好了
.then(res=>res.json())
這個階段的東西稱呼為body裡面含有一些相關的資訊,繼續來看定義檔(所以我說有定義檔真的對CODE理解幫助很大...沒有充分的文件只啃原始碼真的很痛苦)
可以看到Response extends Body的屬性,所以將接下來要取出資料就是利用res.json()來將資料回傳出來變成我們想要的東西
那假若說要POST的話怎辦?
就是為他定義header和要傳送的資料,這一部分可以從RequestInit當中找起,當然對於其中某些定義可以再更詳細,見仁見智吧
OK 找到method的定義,body的定義,所以可以接下來寫POST檔案的傳輸方式
其他東西我很少再用,或許以後處理影音、圖片部分才會有可能需要用到吧
基本上fetch常用方式就這樣,以上都是使用typescript撰寫應用在nodejs,若要使用在broser上應該大同小異。
他是使用Promise去達成async的方法
可惜nodejs中沒有支援fetch必須安裝第三方node-fetch去達成fetch的使用
P.S. 目前我用的7.7.3版依然沒有內建,request老實說已經不想用了
另外最近覺得蠻感動的是chrome 57支援async/await原生啦,不過目前專案的瀏覽器受限於OS只能用43...OTL
就來簡單介紹一下它的功能吧
fetch說道能夠取代xhr和jquery的ajax大概是他的code捨棄了使用callback function這種噁心的東西
改成了目前處理同步/異步最方便的Promise語法
export default function fetch(url: string | Request, init?: RequestInit): Promise<Response>;
我直接拉node-fetch的定義檔說明
後面很明顯的return出來的是Promise的物件,解構之後會得出來是一個Response的東西。
一般對我來說最常用的大概就是POST和GET
所以使用方式就是
import fetch from 'node-fetch';
let a = async()=>{
let data = await fetch('localhost://getData.com')
.then(res=>res.json());
}
如果用import * as fetch from 'node-fetch';
會出現
Cannot invoke an expression whose type lacks a call signature.
這行錯誤,就像我文中那樣進行宣告就好了
.then(res=>res.json())
這個階段的東西稱呼為body裡面含有一些相關的資訊,繼續來看定義檔(所以我說有定義檔真的對CODE理解幫助很大...沒有充分的文件只啃原始碼真的很痛苦)
export class Body {
bodyUsed: boolean;
body: NodeJS.ReadableStream;
json(): Promise<any>;
json<T>(): Promise<T>;
text(): Promise<string>;
buffer(): Promise<Buffer>;
}
export class Response extends Body {
constructor(body?: BodyInit, init?: ResponseInit);
static error(): Response;
static redirect(url: string, status: number): Response;
type: ResponseType;
url: string;
status: number;
ok: boolean;
size: number;
statusText: string;
timeout: number;
headers: Headers;
clone(): Response;
}
可以看到Response extends Body的屬性,所以將接下來要取出資料就是利用res.json()來將資料回傳出來變成我們想要的東西
那假若說要POST的話怎辦?
就是為他定義header和要傳送的資料,這一部分可以從RequestInit當中找起,當然對於其中某些定義可以再更詳細,見仁見智吧
interface RequestInit {
//whatwg/fetch standard options
method?: string;
headers?: HeaderInit | { [index: string]: string };
body?: BodyInit;
redirect?: RequestRedirect;
//node-fetch extensions
timeout?: number; //=0 req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies)
compress?: boolean; //=true support gzip/deflate content encoding. false to disable
size?: number; //=0 maximum response body size in bytes. 0 to disable
agent?: Agent; //=null http.Agent instance, allows custom proxy, certificate etc.
follow?: number; //=20 maximum redirect count. 0 to not follow redirect
//node-fetch does not support mode, cache or credentials options
}
OK 找到method的定義,body的定義,所以可以接下來寫POST檔案的傳輸方式
import fetch, { RequestInit } from 'node-fetch';
let a = async()=>{
let header:RequestInit = {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({a:1})
}
let data = await fetch('localhost://getData.com', header)
.then(res=>res.json());
}
其他東西我很少再用,或許以後處理影音、圖片部分才會有可能需要用到吧
基本上fetch常用方式就這樣,以上都是使用typescript撰寫應用在nodejs,若要使用在broser上應該大同小異。
留言
張貼留言