Leider haben wir aktuell keine Saal Digital Gutscheine oder Angebote verfügbar. Wenn Sie den Gutschein-Alarm aktivieren informieren wir Sie sobald wir neue Gutscheine oder Angebote finden.

Gilt auf deine erste Reinigung Einfach den Code beim Bestellen angeben Der Rabatt wird dann automatisch abgezogen
Gutschein anzeigen


Einfach den Code beim Bestellen angeben Der Rabatt wird dann automatisch abgezogen
Gutschein anzeigen
Gilt auf alles Ausgenommen sind Spender, Tassen, Produkte aus dem Unternehmensbereich und Versandkosten.
Gutschein anzeigen
Einfach den Code beim Bestellen angeben Der Rabatt wird dann automatisch abgezogen
250 Euro Mindestbestellwert

Einfach den Code beim Bestellen angeben Der Rabatt wird dann automatisch abgezogen
25 Eurp Mindestbestellwert

Gilt auf die erste Bestellung via App
Gutschein anzeigen

15% Rabatt für EYEGLASS24 Neukunden. Jetzt Brille neu verglasen lassen und Kennenlern-Rabatt sichern. Wir schenken dir 15% Neukunden-Rabatt auf deine erste Bestellung.
Gutschein anzeigen
Gilt auf das gesamte Angebot

Gilt auf alle Artikel Zusätzlich gibt es bis zu 55% Rabatt auf Wandbilder.

Gilt auf Tinten & Toner # 1. 前言 在上一篇文章中,我们分析了Axios的拦截器原理,知道了拦截器是用过Promise链式调用的特性来实现的。那么接下来我们就通过Axios的请求/响应数据转换器设计和实现来继续感受Promise链式调用的魅力。 # 2. 需求分析 对于请求数据转换器,我们希望允许在发送请求之前可以对请求数据进行一些修改,例如: - 如果请求数据是一个普通js对象,希望可以把它转换为JSON字符串; - 如果请求数据是一个FormData对象,希望可以直接使用,因为浏览器会自动设置Content-Type为multipart/form-data; 对于响应数据转换器,我们希望允许在收到响应数据之后可以对响应数据进行一些修改,例如: - 如果响应数据是一个JSON字符串,希望可以把它转换为js对象; 那么,根据这些需求,我们就可以来设计转换器了。 # 3. 转换器设计 我们根据需求分析可以知道,转换器分为两种:请求转换器和响应转换器。 - 请求转换器:允许在发送请求之前对请求数据进行修改; - 响应转换器:允许在收到响应数据之后对响应数据进行修改; 并且,转换器本质上也是一个函数,这个函数接收一个参数,这个参数就是需要被转换的数据,函数返回的是转换后的数据。 所以,我们可以这样来定义转换器: javascript // 请求转换器 function transformRequest(data) { // 对 data 进行转换处理 return transformedData; } // 响应转换器 function transformResponse(data) { // 对 data 进行转换处理 return transformedData; } 另外,一个转换器可能不够用,我们可能会传入多个转换器,所以,在Axios中,转换器被设计成可以是数组,数组中的每一项都是一个转换器函数,请求会依次调用数组中的每一个转换器,对数据进行转换。 所以,我们可以这样来定义转换器: javascript // 请求转换器 const transformRequest = [ function (data) { // 对 data 进行转换处理 return transformedData; }, function (data) { // 对 data 进行转换处理 return transformedData; }, ]; // 响应转换器 const transformResponse = [ function (data) { // 对 data 进行转换处理 return transformedData; }, function (data) { // 对 data 进行转换处理 return transformedData; }, ]; # 4. 转换器使用位置 我们已经知道了转换器的作用以及如何定义,那么接下来我们就需要知道转换器在Axios中是在哪里使用的。 ## 4.1 请求转换器使用位置 请求转换器是在请求被发送之前对请求数据进行转换的,所以它应该是在请求拦截器之后,请求发送之前被调用。如下: javascript // 添加请求拦截器 axios.interceptors.request.use( function (config) { // 在发送请求之前做些什么 return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); } ); // 转换请求数据 const transformedData = transformRequest(config.data); // 发送请求 sendRequest(transformedData); ## 4.2 响应转换器使用位置 响应转换器是在收到响应数据之后对响应数据进行转换的,所以它应该是在响应拦截器之前,收到响应之后被调用。如下: javascript // 收到响应 const response = receiveResponse(); // 转换响应数据 const transformedData = transformResponse(response.data); // 添加响应拦截器 axios.interceptors.response.use( function (response) { // 对响应数据做点什么 return response; }, function (error) { // 对响应错误做点什么 return Promise.reject(error); } ); # 5. 转换器与拦截器关系 从上面转换器的使用位置我们可以看出,转换器与拦截器之间是存在一定关系的: - 请求转换器在请求拦截器之后被调用; - 响应转换器在响应拦截器之前被调用; 我们可以用以下流程图来表示: bash 请求拦截器 -> 请求转换器 -> 发送请求 -> 接收响应 -> 响应转换器 -> 响应拦截器 # 6. 默认转换器 在Axios中,如果我们没有自定义转换器,那么Axios会使用默认的转换器。默认的转换器定义在/lib/defaults.js文件中。 ## 6.1 默认请求转换器 默认的请求转换器主要是对请求数据做一些简单的转换,例如: - 如果请求数据是一个普通js对象,则把它转换为JSON字符串; - 如果请求数据是一个FormData、ArrayBuffer、Blob、Stream等类型,则直接返回,不做转换; 所以,我们可以这样实现默认的请求转换器: javascript const transformRequest = [ function (data) { if (typeof data === "object" && !isFile(data) && !isFormData(data)) { return JSON.stringify(data); } return data; }, ]; ## 6.2 默认响应转换器 默认的响应转换器主要是对响应数据做一些简单的转换,例如: - 如果响应数据是一个JSON字符串,则把它转换为js对象; 所以,我们可以这样实现默认的响应转换器: javascript const transformResponse = [ function (data) { if (typeof data === "string") { try { data = JSON.parse(data); } catch (e) { // 忽略错误 } } return data; }, ]; # 7. 转换器运行过程 我们已经知道了转换器的定义和使用位置,那么接下来我们就来看看转换器是如何运行的。 转换器的运行过程其实就是对数据的处理过程,我们可以用以下流程图来表示: bash 原始数据 -> 转换器1 -> 转换器2 -> ... -> 转换器n -> 最终数据 也就是说,数据会依次经过每一个转换器,每一个转换器都会对数据进行处理,然后返回处理后的数据,这个处理后的数据会作为下一个转换器的输入,直到最后一个转换器返回最终数据。 # 8. 在 Axios 中的实现 在Axios中,转换器的实现是通过Promise链式调用来实现的。我们可以通过以下代码来模拟转换器的实现: javascript // 转换器运行函数 function transformData(data, transforms) { transforms.forEach(function (transform) { data = transform(data); }); return data; } // 请求转换器 const requestTransforms = [transform1, transform2, ...]; // 响应转换器 const responseTransforms = [transform1, transform2, ...]; // 发送请求 const requestData = transformData(config.data, requestTransforms); sendRequest(requestData); // 接收响应 const responseData = transformData(response.data, responseTransforms); 在Axios源码中,转换器的实现是在/lib/core/dispatchRequest.js文件中的transformData函数中实现的,如下: javascript function transformData(data, headers, fns) { utils.forEach(fns, function (transform) { data = transform(data, headers); }); return data; } 其中,fns就是转换器数组,data就是需要被转换的数据,headers是请求头或响应头,因为有些转换器可能需要根据headers来做一些处理,例如根据Content-Type来判断是否需要转换数据。 # 9. 总结 本篇文章我们分析了Axios的转换器设计和实现。转换器分为请求转换器和响应转换器,它们分别用于在发送请求之前和收到响应之后对数据进行转换。转换器本质上是一个函数,它可以接收一个参数,这个参数就是需要被转换的数据,函数返回的是转换后的数据。转换器可以是数组,数组中的每一项都是一个转换器函数,数据会依次经过每一个转换器,每一个转换器都会对数据进行处理,然后返回处理后的数据,这个处理后的数据会作为下一个转换器的输入,直到最后一个转换器返回最终数据。转换器的实现是通过Promise链式调用来实现的。 通过本篇文章的学习,相信大家对Axios的转换器有了更深入的理解,并且也能够感受到Promise链式调用的魅力。

Gilt auf Poster Nicht kombinierbar mit anderen Gutscheinen. Nur für Poster gültig.

Gilt auf Poster
Wir schicken dir eine E-Mail, wenn es einen neuen
Saal Digital Gutscheincode gibt!
Saal Digital verschickt Bestellungen mit DHL. Im Bestellvorgang können Sie die gewünschte Versandmethode auswählen. Beachten Sie bitte, dass eventuell nicht alle Versanddienstleister für jeden Artikel verfügbar sind. Auch können sich die Kosten je nach Anbieter unterscheiden. Eventuell haben wir einen Saal Digital Versandkostenfrei Gutschein aufgelistet, mit dem Sie einen kostenlosen Versand erhalten.
Saal Digital bietet folgende Zahlmöglichkeiten an: PayPal, MasterCard (Kreditkarte), SEPA Lastschrift, Kauf auf Rechnung. Bei Zahlungen per PayPal hat man in vielen Fällen zudem die Möglichkeit neben der Zahlung mit dem PayPal Guthaben auch mittels SEPA Lastschrift von einem hinterlegten Konto oder Kreditkarte zu zahlen.Eventuell sind nicht alle Zahlmöglichkeiten für alle Dienstleistungen oder Produkte vorhanden. Mehr Informationen hierzu erhalten Sie während dem Bestellvorgang.