一.Promise常見用法
function doSth() {
? ? return New Promise(function(result,reject) { //這里不是真正的反回
? ? ? ? ? ? result();
? ? })
}
或者可以這么寫
function doSth2() {
? ? var defer = Promise.defer();
? ? if(){defer.resolve();}
? ? return defer.promise;
}
之后,可以這么使用
doSth().then(doSth2()).then(doSth())
說的簡(jiǎn)單點(diǎn),Promise的作用就是把回調(diào)的各種函數(shù)變成鏈?zhǔn)秸{(diào)用,非常適合有潔癖的人使用。
二.Promise基本概念
先學(xué)習(xí)promise的基本概念。
promise只有三種狀態(tài),未完成,完成(fulfilled)和失敗(rejected)。
promise的狀態(tài)可以由未完成轉(zhuǎn)換成完成,或者未完成轉(zhuǎn)換成失敗。
promise的狀態(tài)轉(zhuǎn)換只發(fā)生一次
promise有一個(gè)then方法,then方法可以接受3個(gè)函數(shù)作為參數(shù)。前兩個(gè)函數(shù)對(duì)應(yīng)promise的兩種狀態(tài)fulfilled, rejected的回調(diào)函數(shù)。第三個(gè)函數(shù)用于處理進(jìn)度信息。
promiseSomething().then(function(fulfilled){
? ? //當(dāng)promise狀態(tài)變成fulfilled時(shí),調(diào)用此函數(shù)
},function(rejected){
? ? //當(dāng)promise狀態(tài)變成rejected時(shí),調(diào)用此函數(shù)
},function(progress){
? ? //當(dāng)返回進(jìn)度信息時(shí),調(diào)用此函數(shù)
});
nodeJs中也有Promise的概念
var Q = require('q');
var defer = Q.defer();
/**
* 獲取初始promise
* @private
*/
function getInitialPromise() {
? ? return defer.promise;
}
/**
* 為promise設(shè)置三種狀態(tài)的回調(diào)函數(shù)
*/
getInitialPromise().then(function(success){
? ? console.log(success);
},function(error){
? ? console.log(error);
},function(progress){
? ? console.log(progress);
});
defer.notify('in progress');//控制臺(tái)打印in progress
defer.resolve('resolve');? //控制臺(tái)打印resolve
defer.reject('reject');? ? //沒有輸出。promise的狀態(tài)只能改變一次
接著上面的代碼看
var Q = require('q');
var defer = Q.defer();
/**
* 通過defer獲得promise
* @private
*/
function getInputPromise() {
? ? return defer.promise;
}
/**
* 當(dāng)inputPromise狀態(tài)由未完成變成fulfil時(shí),調(diào)用function(fulfilled)
* 當(dāng)inputPromise狀態(tài)由未完成變成rejected時(shí),調(diào)用function(rejected)
* 將then返回的promise賦給outputPromise
* function(fulfilled) 和 function(rejected) 通過返回字符串將outputPromise的狀態(tài)由
* 未完成改變?yōu)閒ulfilled
* @private
*/
var outputPromise = getInputPromise().then(function(fulfilled){
? ? return 'fulfilled';
},function(rejected){
? ? return 'rejected';
});
/**
* 當(dāng)outputPromise狀態(tài)由未完成變成fulfil時(shí),調(diào)用function(fulfilled),控制臺(tái)打印'fulfilled: fulfilled'。
* 當(dāng)outputPromise狀態(tài)由未完成變成rejected, 調(diào)用function(rejected), 控制臺(tái)打印'fulfilled: rejected'。
*/
outputPromise.then(function(fulfilled){
? ? console.log('fulfilled: ' + fulfilled);
},function(rejected){
? ? console.log('rejected: ' + rejected);
});
/**
* 將inputPromise的狀態(tài)由未完成變成rejected
*/
defer.reject(); //輸出 fulfilled: rejected
/**
* 將inputPromise的狀態(tài)由未完成變成fulfilled
*/
//defer.resolve(); //輸出 fulfilled: fulfilled
先寫到這里吧,之后繼續(xù)更新。