为啥使用fetch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥使用fetch相关的知识,希望对你有一定的参考价值。

参考技术A 1,浏览器原生支持,不需要额外引入别的ajax库。

2,代替以前的XHR,是前端技术的前进方向。

3,可以搭配使用 async/await使用语法更简单。

1,一些古董浏览器可能不会支持

2,fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理

3,fetch默认不会带cookie,需要添加配置项

4,无法判断请求进行的状态

1, 方式一 使用原生XHR发送请求

    function XHRAjax(url, type, params) 

        var xhr = new XMLHttpRequest();//创建啊一个XMLHttpRequest()实例

        xhr.onreadystatechange = function () 

            if (xhr.readyState == 4) 

                if ((xhr.status >= 200 && xhr.status < 300) || xhr == 304) 

                    console.log(xhr.responseText)

                 else 

                    console.log("request is fail" + xhr.status)

                

            

        

        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");//设置请求头

        xhr.open(type, url, true);

        xhr.send(params);

    

2,方式二 使用jquery ajax写法

    function JQAjax(url, type, params) 

        $.ajax(

            type: type,

            data: params,

            contentType: 'application/x-www-form-urlencoded',

            url: url,

            success: function (data) 

                console.log(data)

            ,

            error: function (err) 

                console.log(err)

            

        )

    

3,方式三 使用axios写法

    async function axiosAjax(url, type , params) 

        var re = await axios(

            url: url,

            data: params,

            headers:  'Content-Type': 'application/x-www-form-urlencoded' ,

            method: type

        )   

        return re;

    

4, 方式四 使用fetch写法

async function fetchAjax(url, type, params) 

        var response = await fetch(url, 

            method: type,

            headers: 

                'Content-Type': 'application/x-www-form-urlencoded'

            ,

            body: params

        )

        var re=await response.json;

        return re;

    

通过对比以上几种写法,原生xhr写法太麻烦,还需自己处理浏览器兼容问题。jquery ajax其实很强大,jquery在以前普及率非常高,但现在已经被mvvc框架替代。axios当前也比较成熟,很多项目都在使用,可以结合async/await一起使用非常方便。使用fetch不需要引入别的ajax库,未来会越来越普及,但是使用过程中可能会遇到很多坑。个人建议,在项目开发尽量使用axios,个人学习上多使用fetch紧跟前端技术前进的步伐。

示例源码地址   https://github.com/panergongzi/ajaxDemo.git

1, 《传统 Ajax 已死,Fetch 永生》 ,2, 《fetch没有你想象的那么美》 3, 《fetch使用的常见问题及解决方法》

4, https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch

为啥我不能使用闭包创建 Fetched Results Controller?

【中文标题】为啥我不能使用闭包创建 Fetched Results Controller?【英文标题】:Why can't I create a Fetched Results Controller using a closure?为什么我不能使用闭包创建 Fetched Results Controller? 【发布时间】:2017-05-25 13:33:13 【问题描述】:

我正在尝试按照一些教程创建一个 Fetched Results Controller。但是,在 Swift 3 中,当尝试按照您在下面看到的模式中创建闭包类型时,出现错误“无法推断复杂闭包类型”。

class FriendsController: UICollectionViewController 

lazy var fetchedResultsController: NSFetchedResultsController = 
    let context = (UIApplication.shared.delegate as! 
AppDelegate).persistentContainer.viewContext

    let fetchRequest: NSFetchRequest = Friend.fetchRequest()

    let fetchedResultsController = 
NSFetchedResultsController(fetchRequest: fetchRequest, 
managedObjectContext: context, sectionNameKeyPath: nil, cacheName: 
nil)
    return fetchedResultsController
()

我在制作视图、按钮等其他东西时使用这种闭包模式,但是它不起作用(即使我不使用惰性变量)。这个错误对我来说也不是很清楚(如上所述)。谢谢。

【问题讨论】:

【参考方案1】:

NSFetchedResultsController 在 Swift 3 中是通用的。您必须指定具体类型,因为编译器无法推断复杂的闭包类型

lazy var fetchedResultsController: NSFetchedResultsController<Friend> =  ...

【讨论】:

谢谢瓦迪安。这是有道理的,因为教程是在 Swift 2x 中,只有我在 Swift 3 中遇到错误。我很高兴我现在在上面的代码中包含了 fetchRequest!【参考方案2】:

因为您应该指定 FetchedResultsControllers 持有的对象的通用类型

lazy var fetchedResultsController: NSFetchedResultsController<Friend> = 

    let context = //your context

    let req = // your request

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: req, managedObjectContext:context, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController.delegate = self

    do 
        try fetchedResultsController.performFetch()

    
    catch 
        print("fetch error \(error)")
    
    return fetchedResultsController
()

【讨论】:

非常感谢亚历克斯。现在说得通了!

以上是关于为啥使用fetch的主要内容,如果未能解决你的问题,请参考以下文章

为啥对 fetch 响应使用解构赋值会导致 .json() 方法消失?

为啥我在尝试使用 fetch 连接 Api 时收到“错误请求”错误 400?

为啥我不能使用闭包创建 Fetched Results Controller?

为啥使用 redux-thunk 或 redux-saga 进行 fetches?

为啥 fetch 返回 promise 未决?

为啥 NULL 左外连接使用 sqlsrv_fetch_array 在 PHP 中停止数据集导航?