js中then()函数详解

JavaScript038

js中then()函数详解,第1张

then: function (callback, errback) {

var result = defer()

有两个部分,then 和 always,两个都是可执行的方法。

always 这里不作讨论。来看看then ,它有两个参数,callback 和 errback, 第一个用来处理“resolved”和“success”事件;第二个用来处理“rejected”和“failure”事件。

所以,delay.promise不是现成的数据,还不能直接使用。然后来看看这个then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):

then()方法是异步执行。

意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。

语法:promise.then(onCompleted, onRejected)

参数

promise必需。Promise 对象。

onCompleted必需。承诺成功完成时要运行的履行处理程序函数。

onRejected可选。承诺被拒绝时要运行的错误处理程序函数

举例

可以理解成navigator.mediaDevices.getUserMedia(constrains) 返回一个参数stream ,然后执行function功能

总的来说有一个功能,用Angular JS的post方法向后台发送请求,然后后台返回一段数据交个Angular 来进行处理,先看看service部分:

[javascript] view plain copy

fs.services.factory('MonitorService', ['$http', '$q', function ($http, $q) {

return {

queryByYearOrMonth: function (postData) {

var delay = $q.defer()

$http.post(fs.common.baseResourceURL2 + '/api/monitor/uploadQuantity', postData,{})

.success(function (data) {

delay.resolve(data)

}).error(function () {

delay.reject("Can't search uploadQuantity data.")

})

return delay.promise

}

}

}])

如果不经过深入测试的话,第一反应是觉得 delay.resolve(data)这句在处理数据,把数据放在delay对象的promise中,因为最后一句是return delay.promise,想当然地认为

delay.promise就是已经处理好的可以交给controller使用的数据,但经过实际测试,发现不是这么回事。

那就来看看delay.promise到底是什么?在浏览器控制台中,以此输出delay.promise中的属性和值,如下:

[javascript] view plain copy

then: function (callback, errback) {

var result = defer()

var wrappedCallback = function(value) {

try {

result.resolve((callback || defaultCallback)(value))

} catch(e) {

exceptionHandler(e)

result.reject(e)

}

}

var wrappedErrback = function(reason) {

try {

result.resolve((errback || defaultErrback)(reason))

} catch(e) {

exceptionHandler(e)

result.reject(e)

}

}

if (pending) {

pending.push([wrappedCallback, wrappedErrback])

} else {

value.then(wrappedCallback, wrappedErrback)

}

return result.promise

}

always: function (callback) {

function makePromise(value, resolved) {

var result = defer()

if (resolved) {

result.resolve(value)

} else {

result.reject(value)

}

return result.promise

}

function handleCallback(value, isResolved) {

var callbackOutput = null

try {

callbackOutput = (callback ||defaultCallback)()

} catch(e) {

return makePromise(e, false)

}

if (callbackOutput && callbackOutput.then) {

return callbackOutput.then(function() {

return makePromise(value, isResolved)

}, function(error) {

return makePromise(error, false)

})

} else {

return makePromise(value, isResolved)

}

}

return this.then(function(value) {

return handleCallback(value, true)

}, function(error) {

return handleCallback(error, false)

})

}

有两个部分,then 和 always,两个都是可执行的方法。

always 这里不作讨论。来看看then ,它有两个参数,callback 和 errback, 第一个用来处理“resolved”和“success”事件;第二个用来处理“rejected”和“failure”事件。

所以,delay.promise不是现成的数据,还不能直接使用。然后来看看这个then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):

[javascript] view plain copy

uploadQuantityLoader(params).then(function(Cquantity){

$scope.quantityMap = Cquantity.quantityMap

makeGraph()

})

then(fn) 方法中带一个参数,这个参数就是要被执行的函数,并且,这个作为参数的函数本身有一个参数,这个参数就是我们需要的数据,这里是关键,本例中也就是

Cquantity,然后这个Cquantity就可以放在函数里面进行处理了。