angular 怎么把promise对象改为同步的

angular 怎么把promise对象改为同步的,第1张

这篇文章主要介绍了Angular中的Promise对象($q介绍),本文讲解了Promise模式、Q Promise的基本用法、AngularJs中的$q.defferd等内容,需要的朋友可以参考下 在用JQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。 Promise Promise是一种模式,以同步 *** 作的流程形式来 *** 作异步事件,避免了层层嵌套,可以链式 *** 作异步事件。 我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。 ES6中Promise、angularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下: 每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。 1.pending状态:可以过渡到履行或拒绝状态。 2.fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。 3.rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。 状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。 代码如下: function okToGreet(name){ return name === 'Robin Hood' } function asyncGreet(name) { var deferred = $q.defer() setTimeout(function() { // 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变 $scope.$apply(function() { deferred.notify('About to greet ' + name + '.') if (okToGreet(name)) { deferred.resolve('Hello, ' + name + '!') } else { deferred.reject('Greeting ' + name + ' is not allowed.') } }) }, 1000) return deferred.promise } var promise = asyncGreet('Robin Hood') promise.then(function(greeting) { alert('Success: ' + greeting) }, function(reason) { alert('Failed: ' + reason) }, function(update) { alert('Got notification: ' + update) }) Q Promise的基本用法 上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步 *** 作成功,则用resolve方法将Promise对象的状态变为“成功”(即从pending变为resolved);如果异步 *** 作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。 JS将要有原生Promise,ES6中已经有Promise对象,firefox和Chrome 32 beta版本已经实现了基本的Promise API AngularJs中的$q.defferd 通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将Promises/A规范中的三个任务状态通过API关联。 deffered API deffered 对象的方法 1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。 2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。 3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。 deffered 对象属性 promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。 Promise API 当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。 promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。 promise 对象的方法 1.then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。 2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式 3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅 完整文档规范. 通过then()方法可以实现promise链式调用。 代码如下: promiseB = promiseA.then(function(result) { return result + 1 }) // promiseB 将会在处理完 promiseA 之后立刻被处理, // 并且其 value值是promiseA的结果增加1 $q的其他方法 $q.when(value):传递变量值,promise.then()执行成功回调 $q.all(promises):多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象

原因是:创建了一个大的controller,然后把ajax的内容放到里面,然后通过$broadcast发送给了下面的controller。直接使用service的方法还是没有找到。

解决方法如下:

home.factory("FormItem",function($q, $http){

    var item = {}

    var deferred

    var getItem = function(path) {

        //请求过就不再请求了

        if(deferred) {

            return deferred.promise

        }

        deferred = $q.defer()

        if(path!="") {

            $http.get("/api/get_fiddle/index/"+path).success(function(data){

                deferred.resolve(data)

            })

        } else {

            deferred.resolve(item)

        }

        return deferred.promise

    }

    return {

        getItem: getItem

    }

})

把AngularJS开发的页面迁移到微信小程序

目录迁移

1、每个子模块页面换成Pages目录下的一个子目录,目录命名就是原子模块名。

2、原来的通用css、image、fonts等静态资源统一移到resource目录下,需要使用时,对于css样式文件,在对应子模块的wxss文件首部通过import命令引入;

替换规则

1、div需统一转换成View;

2、ng-show统一转换为wx:if;

3、ng-click统一转换为bindtap;

4、ng-repeat统一用wx:for替换;

5、ng-class中的样式选择性绑定可以直接把条件绑定语句嵌入class属性;

js代码

模块级代码迁移: 可将模块级作用域使用的通用逻辑搬到app.js中,通过app对象来引用;或者定义一个util模块,来做动态引入; 对于原生与h5交互时用到的自定义事件,需要根据具体场景做处理。

子模块级代码迁移:

可将Angular子模块代码直接迁移到小程序对应Page对象中,当然,对于Angular特定语法的$***对象(例如$scope、$rootscope)的 *** 作,需要做全局替换,替换原则是:

1、$scope:与Page对象同生命周期内的$scope,可以直接替换成this;而对于非同一生命周期的(最常见的即是各种callback回调函数),需要将Page对象在方法外做引用保存(例如var self=this),然后在回调函数中使用。

2、$rootScope:推荐放入app对象中引用,或者自定义通用模块,然后动态引入;

3、数据模型:各页面中建立的数据模型,直接放入***.json文件中,如果涉及Angular特定语法的 *** 作,可参考上述两点的做法进行替换;

4、jsonp请求:将jsonp请求统一替换成wx.request请求,只是原来的链式写法要换成参数型写法;

5、子模块间的页面跳转,$state.go统一替换成wx.navigateTo或wx.navigateBack;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11732498.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存