‘壹’ .then()这个方法是什么意思
then()方法是异步执行。
意思是:就是当.then()前的方法执行完后再执行then()内部的程序,这样就避免了,数据没获取到等的问题。
语法:promise.then(onCompleted, onRejected);
参数
promise
必需。
Promise 对象。
onCompleted
必需。
承诺成功完成时要运行的履行处理程序函数。
onRejected
可选。
承诺被拒绝时要运行的错误处理程序函数。
‘贰’ 最近在找前端工作,然后面试的时候人家问我。promise为啥能解决地狱回调,为什么能一直.then
ES2015(即 ECMAScript 6、ES6) 正式发布。其中 Promise 被列为正式规范,成为 ES6 中最重要的特性之一。
简单来讲,then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作。
‘叁’ js的promise如何递归调用
递归是Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容,也就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可
举例如下:
//假如用jQuery
function get(url, p) {
return $.get(url + "?page=" + p)
.then(function(data) {
if(!data.list.length) {//递归结束条件
return [];
}
return get(url, p+1)//递归调用
.then(function(nextList) {
return [].concat(data.list, nextList);//合并递归内容
});
});
}
get("urlurl", 1).then(function(list) {
console.log(list);//your full list is here
});
‘肆’ Promise怎么跳出then到最后的finally
1、then支持延续任务调用方式(Continuation tasks),而done不支持
比如then可以这样用,而done不可以:
promise().then().then().then()
2. then会捕获未处理的异常然后把错误状态作为返回值返回,而done则会把异常直接抛出
‘伍’ 怎么使用jquery的then方法
使用jquery的then方法
1.Deferred.then()相当于Deferred.done()、Deferred.fail()、Deferred.progress()的合体,可以同时注册3个状态下的回调函数。
[javascript]view plain
functionsuccess(data)
{
alert("successdata="+data);
}
functionfail(data)
{
alert("faildata="+data);
}
functionprogress(data)
{
alert("progressdata="+data);
}
vardeferred=$.Deferred();
//一起注册回调
deferred.then(success,fail,progress);
//分别注册回调
deferred.done(success);
deferred.fail(fail);
deferred.progress(progress);
deferred.notify("10%");
deferred.resolve("ok");
2.Deferred.then()解决多个异步操作之间有依赖的问题,这才是then()真正有意义的场景。JQuery1.8之后,then()取代了过时的pipe()方法。这种场景下,我们需要使用Deferred.then()返回的新Promise对象。上面的第一种使用方式,我们忽略了Deferred.then()的返回值。
[javascript]view plain
vardeferred=$.Deferred();
//使用then()注册一个resolved状态的回调函数,并返回一个过滤后的promise
//返回的filtered已经不是原来的Deferred或者Promise对象了
varfiltered=deferred.then(function(value){
alert("triggerDeferredfilter.value="+value);//5
returnvalue*2;
});
//用过滤后的Promise再次注册回调函数
filtered.done(function(value){
alert("filteredvalue="+value);//10
});
deferred.resolve(5);
我们用deferred.then()注册了一个完成状态下的回调函数,这个回调函数得到的值是5;之后用filtered这个新的Promise注册回调函数,这个回调函数中得到的值是10(第一个回调函数的返回结果)。现在我们看下JQuery官方对then的解释:
These filter functions can return a new value to be passed along to the promise's .done() or .fail() callbacks, or they can return another observable object (Deferred, Promise, etc) which will pass its resolved / rejected status and values to the promise's callbacks. If the filter function used is null, or not specified, the promise will be resolved or rejected with the same values as the original.
我们知道deferred.resolve()、deferred.reject()、deferred.notify()可以指定参数值,这个参数会传递给相应状态下的回调函数。如果我们使用的是done()、fail()、progress()注册的回调函数,那么某个状态下的所有回调函数得到的都是相同参数。但是如果我们使用了then()注册回调函数,那么第一回调函数的返回值将作为第二个回调函数的参数,同样的第二个函数的返回值是第三个回调函数的参数。可以对比下面的2段代码,体会下done()和then的差别。
[javascript]view plain
vardeferred=$.Deferred();
//done()返回的仍然是原来的Deferred对象
vardone_ret=deferred.done(function(data){
alert("data="+data);//5
return2*data;
});
alert(deferred==done_ret);//true
done_ret.done(function(data){
alert("data="+data);//5
});
deferred.resolve(5);
[javascript]view plain
vardeferred=$.Deferred();
//then()返回的是一个新Promise对象
//then注册的回调函数的返回值将作为这个新Promise的参数
varthen_ret=deferred.then(function(data){
alert("data="+data);//5
return2*data;
});
alert(then_ret==deferred);//false
then_ret.done(function(data){
alert("data="+data);//10
});
deferred.resolve(5);
[javascript]view plain
vardefer=$.Deferred();
varfiltered=defer.then(null,function(value){
returnvalue*3;
});
defer.reject(6);
filtered.fail(function(value){
alert("Valueis(3*6=)18:"+value);
});
下面这段代码可以实现chain tasks,解决异步操作中回调难的问题。
[javascript]view plain
vardefered=$.Deferred();
varpromise1=defered.then(function(data){
alert(data);//
returndata+="1";
});
varpromise2=promise1.then(function(data){
alert(data);//1
returndata+="2";
});
varpromise3=promise2.then(function(data){
alert(data);//12
returndata+="3";
});
promise3.done(function(data){
alert(data);//123
});
defered.resolve("");
[javascript]view plain
varpromise1=$.ajax(url1);
varpromise2=promise1.then(function(data){
return$.ajax(url2,{"data":data});
});
varpromise3=promise2.then(function(data){
return$.ajax(url3,{"data":data});
});
promise3.done(function(data){
//dataretrievedfromurl3
});
‘陆’ then的用法
then的用法:
1.then的意思是“当时,那时”“接着,于是,然后”“还有,而且”“那么,因此”,作“那时”解时可指过去,也可指将来。
2.then作“那么”解时常用于句首或句末,用来缓和语气; 作“然后”解时常位于and之后,所修饰的词语之前,起连接作用。
3.then有时可用于对已经提到过或刚提到过的某物表示一般的看法,可译作“则是,就是”。
4.then用作状语作“接着,于是,然后”解时也可位于句首,这时句子要用倒装语序。
then读音:英 [ðen] 美 [ðen]
释义:
1.adv.(指过去)当时,那时;然后;接着;其后;后来;那么;因此;既然如此
例句:
.
如果你只采集了一个样本,那么所有的数据就有问题了。
2.adj.当时(任职等)的
例句:
她将当时的情况和目前的危机进行对比。
‘柒’ js中promise到底怎么用
我举个生活中的例子吧,比如说你去麦当劳买吃的,你下订单后,会给你一个小纸条,这个小纸条相当于你和麦当劳之间的约定,这个小纸条也可以理解为你所定的餐的一个占位符。等麦当劳饭做好了的时候,会吧饭送到你面前,并且把小纸条收走。
这个如果在代码中的话,就意味着,你在执行代码的时候,可能会在未来某个时刻才会取到值(异步),等在值取到以后,会进行一些相应的处理,比如说ajax,这实际上就是promise的一个典型的应用场景。
我刚刚只是说了promise的一个大的应用场景,我觉得只要能把握住这个,具体的API就可以了。
假如你想对它的使用有一个更深入的了解的话,我还可以推荐你一个小文章: Javascript基础之-Promise
加油
‘捌’ JavaScript中then的作用
总的来说有一个功能,用Angular JS的post方法向后台发送请求,然后后台返回一段数据交个Angular 来进行处理,先看看service部分:
[javascript]view plain
fs.services.factory('MonitorService',['$http','$q',function($http,$q){
return{
queryByYearOrMonth:function(postData){
vardelay=$q.defer();
$http.post(fs.common.baseResourceURL2+'/api/monitor/uploadQuantity',postData,{})
.success(function(data){
delay.resolve(data);
}).error(function(){
delay.reject("Can'tsearchuploadQuantitydata.");
});
returndelay.promise;
}
}
}]);
delay.promise就是已经处理好的可以交给controller使用的数据,但经过实际测试,发现不是这么回事。
那就来看看delay.promise到底是什么?在浏览器控制台中,以此输出delay.promise中的属性和值,如下:
[javascript]view plain
then:function(callback,errback){
varresult=defer();
varwrappedCallback=function(value){
try{
result.resolve((callback||defaultCallback)(value));
}catch(e){
exceptionHandler(e);
result.reject(e);
}
};
varwrappedErrback=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);
}
returnresult.promise;
}
always:function(callback){
functionmakePromise(value,resolved){
varresult=defer();
if(resolved){
result.resolve(value);
}else{
result.reject(value);
}
returnresult.promise;
}
functionhandleCallback(value,isResolved){
varcallbackOutput=null;
try{
callbackOutput=(callback||defaultCallback)();
}catch(e){
returnmakePromise(e,false);
}
if(callbackOutput&&callbackOutput.then){
returncallbackOutput.then(function(){
returnmakePromise(value,isResolved);
},function(error){
returnmakePromise(error,false);
});
}else{
returnmakePromise(value,isResolved);
}
}
returnthis.then(function(value){
returnhandleCallback(value,true);
},function(error){
returnhandleCallback(error,false);
});
}
always 这里不作讨论。来看看then ,它有两个参数,callback 和 errback, 第一个用来处理“resolved”和“success”事件;第二个用来处理“rejected”和“failure”事件。
所以,delay.promise不是现成的数据,还不能直接使用。然后来看看这个then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):
[javascript]view plain
uploadQuantityLoader(params).then(function(Cquantity){
$scope.quantityMap=Cquantity.quantityMap;
makeGraph();
});
Cquantity,然后这个Cquantity就可以放在函数里面进行处理了。
‘玖’ JavaScript 这个 then 是什么意思
.then字面意思就是上一步执行完了,执行下一步,不过这是 Promise 对象的方法,非 Promise 对象没有 then 方法。在 jQuery 中 Promise 叫作 Deferred 对象。