js中的callback与promise

版权声明: https://blog.csdn.net/weixin_41849462/article/details/81988637

在工作中遇到了promise上的问题,搞定之后静心做一下总结。

首先,js中的callback与promise的区别实际就是宽度和深度的区别。

1.回调函数:函数当参数,传递另外一个函数

定义:在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,  并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就  叫做匿名回调函数。

一个栗子:

function fn1(fn2) {//fn2:回调函数
            setTimeout(function() {
                console.log(1);
                fn2 && typeof fn2 === 'function' && fn2();
            }, 1000);
        }
        fn1(function(){
        	 console.log(2);
        });
function fn1(fn2) {
        setTimeout(function() {
            console.log(1);
            fn2 && typeof fn2 === 'function' && fn2();
        }, 1000);
    }

	function fn2(){
    	 console.log(2);
    }

    fn1();
    fn2()

在例子中,函数fn2作为参数(函数引用)传递到另一个函数fn1中,  并且这个函数fn1执行函数fn2。我们就说函数fn2叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。

回调函数应用场景实例:

1.缓冲运动回调函数---链式。

2.ajax函数封装--完成某个动作,取返回值。

3.jsonp里面--函数名当作参数。

弊端:回调函数的嵌套:可读性很差 。---深度   栗子:

function fn1(fn2, str) {
            setTimeout(function() {
                var arr = str.split('');
                str = arr.sort().join('');
                console.log(str);
                fn2 && typeof fn2 === 'function' && fn2(str);
            }, 1000);
        }

        fn1(function(str) {
            var arr1 = str.split('');
            var newarr = [];
            for (var i = 0; i < arr1.length; i++) {
                if (newarr.indexOf(arr1[i]) == -1) {
                    newarr.push(arr1[i
                ]);
                }
            }
            console.log(newarr.join(''));
            fn1(function(str) {
                var arr1 = str.split('');
                var newarr = [];
                for (var i = 0; i < arr1.length; i++) {
                    if (newarr.indexOf(arr1[i]) == -1) {
                        newarr.push(arr1[i]);
                    }
                }
                console.log(newarr.join(''));
                fn1(function(str) {
                    var arr1 = str.split('');
                    var newarr = [];
                    for (var i = 0; i < arr1.length; i++) {
                        if (newarr.indexOf(arr1[i]) == -1) {
                            newarr.push(arr1[i]);
                        }
                    }
                    console.log(newarr.join(''));
                    fn1(function(str) {
                        var arr1 = str.split('');
                        var newarr = [];
                        for (var i = 0; i < arr1.length; i++) {
                            if (newarr.indexOf(arr1[i]) == -1) {
                                newarr.push(arr1[i]);
                            }
                        }
                        console.log(newarr.join(''));
                        fn1(function(str) {
                            var arr1 = str.split('');
                            var newarr = [];
                            for (var i = 0; i < arr1.length; i++) {
                                if (newarr.indexOf(arr1[i]) == -1) {
                                    newarr.push(arr1[i]);
                                }
                            }
                            console.log(newarr.join(''));
                            fn1(function(str) {
                                var arr1 = str.split('');
                                var newarr = [];
                                for (var i = 0; i < arr1.length; i++) {
                                    if (newarr.indexOf(arr1[i]) == -1) {
                                        newarr.push(arr1[i]);
                                    }
                                }
                                console.log(newarr.join(''));
                                fn1(function(str) {
                                    var arr1 = str.split('');
                                    var newarr = [];
                                    for (var i = 0; i < arr1.length; i++) {
                                        if (newarr.indexOf(arr1[i]) == -1) {
                                            newarr.push(arr1[i]);
                                        }
                                    }
                                    console.log(newarr.join(''));
                                    fn1(function(str) {
                                        var arr1 = str.split('');
                                        var newarr = [];
                                        for (var i = 0; i < arr1.length; i++) {
                                            if (newarr.indexOf(arr1[i]) == -1) {
                                                newarr.push(arr1[i]);
                                            }
                                        }
                                        console.log(newarr.join(''));
                                        fn1(function(str) {
                                            var arr1 = str.split('');
                                            var newarr = [];
                                            for (var i = 0; i < arr1.length; i++) {
                                                if (newarr.indexOf(arr1[i]) == -1) {
                                                    newarr.push(arr1[i]);
                                                }
                                            }
                                            console.log(newarr.join(''));
                                            fn1(function(str) {
                                                var arr1 = str.split('');
                                                var newarr = [];
                                                for (var i = 0; i < arr1.length; i++) {
                                                    if (newarr.indexOf(arr1[i]) == -1) {
                                                        newarr.push(arr1[i]);
                                                    }
                                                }
                                                console.log(newarr.join(''));
                                            }, 'j')
                                        }, 'i')
                                    }, 'h')
                                }, 'g')
                            }, 'f')
                        }, 'e')
                    }, 'd')
                }, 'c')
            }, 'b')
        }, 'a');

2.promise:异步编程的一种解决方案(es6)。可取代callback

     promise构造函数:比传统的回调函数更合理,更强大。

     创建promise实例对象,构造函数的参数又是一个函数对象,函数对象里面又有两个参数,一个 代表成功的回调,一个是失败的回调。

      promise状态:pending(进行中) resolve(成功,已解决) reject(失败,未解决)  , 状态一旦设定,不可改变。

      pending-->resolve 进行中-->成功

      pending-->reject 进行中-->失败

栗子:

 var promise = new Promise(function(resolve, reject) { //resolve:成功,名字等于函数体,reject:失败,一样的
            setTimeout(function() {
                console.log(1);
                resolve(); //成功--then
                reject(); //失败--catch
                resolve('我是resolve'); //带参数
            }, 1000);
        });

        promise
            .then(function(str) { //成功的指向。  获取传递的参数。
                console.log(2);
                console.log(str); //我是resolve
            })
            .catch(function() { //失败的失败。
                console.log('我错了');
			})

再来一个:

var promise = new Promise(function(resolve, reject) {
            let cImg = new Image();
            cImg.src = 'http://h.hiphotos.baidu.com/image/h%3D300/sign=7be12c140ce9390149028b3e4bec54f9/a9d3fd1f4134970a3776841b98cad1c8a7865df8.jpg';
            cImg.onload = function() {
                resolve(this);
            };
            cImg.onerror = function() {
                reject('路径错误');
            };
        });

        promise.then(function(obj) {
            document.body.appendChild(obj);
        }).catch(function(d) {
            alert(d);
        });

差不多了 ,回来再聊

猜你喜欢

转载自blog.csdn.net/weixin_41849462/article/details/81988637