『壹』 .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 對象。