一.方法
Promise.resolve(value)
方法返回一個以給定值解析后的Promise
對象罗捎。如果該值為promise告丢,返回這個promise打厘;如果這個值是thenable(即帶有"then" 方法
)),返回的promise會“跟隨”這個thenable的對象辨泳,采用它的最終狀態(tài)蓖扑;否則返回的promise將以此值完成唉铜。此函數(shù)將類promise對象的多層嵌套展平。
const textResolve = () => {
let promise = Promise.resolve('test resolve');
promise.then(value => {
console.log("then ="+value);
}).catch(error => {
console.log("error ="+error);
});
};
結果:
LOG then =test resolve
Promise.reject(value)
方法返回一個帶有拒絕原因的Promise對象
const textReject = () => {
let promise = Promise.reject('test reject');
promise.then(value => {
console.log('then =' + value);
}).catch(error => {
console.log('error =' + error);
});
promise.then(value => {
console.log('then1 =' + value);
},error => {
console.log('error1 =' + error);
});
Promise.reject(new Error('test error ')).then(value => {
console.log('resolve value ' + value);
}, error => {
console.log('reject value ' + error);
});
};
結果:
LOG error1 =test reject
LOG reject value Error: test error
LOG error =test reject
Promise.all(iterable)
方法返回一個 [Promise
] 實例律杠,此實例在 iterable
參數(shù)內(nèi)所有的 promise
都“完成(resolved)”或參數(shù)中不包含 promise
時回調(diào)完成(resolve)潭流;如果參數(shù)中 promise
有一個失敗(rejected)俩功,此實例回調(diào)失敾猛鳌(reject),失敗原因的是第一個失敗 promise
的結果
const testMain=()=>{
Promise.all([test1(),test2()]).then(results=>{
console.log(results[0]);
console.log(results[1]);
}).catch(error=>{
console.log("error==="+error);
});
};
const test1=()=>{
console.log("test1==start");
return new Promise((resolve, reject) => {
console.log("==========1");
setTimeout(()=>{
console.log("test1");
resolve("my name is test1");
console.log("test1==end");
},2000);
});
};
const test2=()=>{
console.log("test2==start");
return new Promise((resolve, reject) => {
console.log("==========2");
setTimeout(()=>{
console.log("test2");
resolve("my name is test2");
console.log("test2==end");
},2000);
});
};
結果:
Promise.race(iterable)
方法返回一個 promise
實例诡蜓,一旦迭代器中的某個promise
解決或拒絕熬甫,返回的 promise
就會解決或拒絕。
如同上例蔓罚,吧all改成race
const testMain=()=>{
Promise.race([test1(),test2()]).then(results=>{
console.log(results);
}).catch(error=>{
console.log("error==="+error);
});
};
結果
二.react-native中Promise實戰(zhàn)
平常我們使用fetch請求網(wǎng)絡是這樣寫的
const get = (url, success, fail) => {
fetch(url, {
method: 'GET',
}).then(rsp => rsp.json())
.then(rsp => {
if (rsp.error) {
fail && fail('==== fail');
} else {
success && success(rsp);
}
}).catch(error => {
fail && fail('==== fail' + error);
});
};
加入Promise后是這樣寫的
const getPromise = (url) => {
return new Promise((resolve, reject) => {
fetch(url, {
method: 'GET',
}).then(rsp => rsp.json())
.then(rsp => {
if (rsp.error) {
reject('==== fail');
} else {
resolve(rsp);
console.log(JSON.stringify(rsp));
}
}).catch(error => {
console.log('error==' + error);
reject('==== fail' + error);
});
});
};
調(diào)用 都可以拿到所需要的結果
const loadData = () => {
let url = 'http://gank.io/api/xiandu/categories';
get(url, rsp => {
console.log(JSON.stringify(rsp));
}, error => {
console.log('error==' + error);
});
getPromise(url).then(rsp => {
console.log(JSON.stringify(rsp));
}).catch(error => {
console.log('error==' + error);
});
};
有人回說fetch 也是promise椿肩,可以直接return回去嘛。
嗯 是可以的豺谈,但是網(wǎng)絡請求郑象,很多東西需要統(tǒng)一處理的,所以外面再加一層promise來封裝好點茬末。
這里有個問題厂榛,fetch沒有自帶的請求超時,這個時候丽惭,我們就可以想到Promise.race方法了击奶。
一個網(wǎng)絡請求的promise 一個超時的promise 誰先結束就返回誰的結果。知道怎么寫了么责掏,
看看是否一樣
const timeOut = (httpPromise, time = 6000) => {
let timeOut = new Promise((resolve, reject) => {
setTimeout(() => {
reject('time_out');
}, time);
});
return Promise.race([httpPromise, timeOut]);
};
調(diào)用
const get = (url, success, fail) => {
timeOut(fetch(url, {
method: 'GET',
}), 100)
.then(rsp => rsp.json())
.then(rsp => {
if (rsp.error) {
fail && fail('==== fail');
} else {
success && success(rsp);
}
}).catch(error => {
fail && fail('==== fail' + error);
});
};
const getPromise = (url) => {
return new Promise((resolve, reject) => {
timeOut(fetch(url, {
method: 'GET',
}), 600)
.then(rsp => rsp.json())
.then(rsp => {
if (rsp.error) {
reject('==== fail');
} else {
resolve(rsp);
console.log(JSON.stringify(rsp));
}
}).catch(error => {
console.log('error==' + error);
reject('==== fail' + error);
});
});
};
結果1和結果2:
LOG error====== failtime_out
LOG {"error":false,"results":[{"_id":"57c83777421aa97cbd81c74d","en_name":"wow","name":"科技資訊","rank":1},{"_id":"57c83577421aa97cb162d8b1","en_name":"apps","name":"趣味軟件/游戲","rank":5},{"_id":"57a97cbd81c74b","en_name":"imrich","name":"裝備黨","rank":50},{"_id":"57c836b4421aa97cbd81c74c","en_name":"funny","name":"草根新聞","rank":100},{"_id":"5827dc81421aa911e32d87cc","en_name":"android","name":"","rank":300},{"_id":"582c5346421aa95002741a8e","en_name":"diediedie","name":"創(chuàng)業(yè)新聞","rank":340},{"_id":"5829c2bc421aa911e32d87e7","en_name":"thinking","name":"獨立思想","rank":400},{"_id":"5827dd7b421b7eca","en_name":"iOS","name":"iOS","rank":500},{"_id":"5829b881421aa911dbc9156b","en_name":"teamblog","name":"團隊博客","rank":600}]}
LOG {"error":false,"results":[{"_id":"57c83777421aa97cbd81c74d","en_name":"wow","name":"科技資訊","rank":1},{"_id":"57c83577421aa97cb162d8b1","en_name":"apps","name":"趣味軟件/游戲","rank":5},{"_id":"57a97cbd81c74b","en_name":"imrich","name":"裝備黨","rank":50},{"_id":"57c836b4421aa97cbd81c74c","en_name":"funny","name":"草根新聞","rank":100},{"_id":"5827dc81421aa911e32d87cc","en_name":"android","name":"","rank":300},{"_id":"582c5346421aa95002741a8e","en_name":"diediedie","name":"創(chuàng)業(yè)新聞","rank":340},{"_id":"5829c2bc421aa911e32d87e7","en_name":"thinking","name":"獨立思想","rank":400},{"_id":"5827dd7b421b7eca","en_name":"iOS","name":"iOS","rank":500},{"_id":"5829b881421aa911dbc9156b","en_name":"teamblog","name":"團隊博客","rank":600}]}
當然還有更多用得到的地方柜砾,比如 AsyncStorage
我們經(jīng)常用它來儲取一個數(shù)據(jù),先看看源碼换衬。如get方法,它就是callBack 和Promise一起用的痰驱。
/**
* Fetches an item for a `key` and invokes a callback upon completion.
*
* See http://facebook.github.io/react-native/docs/asyncstorage.html#getitem
*/
getItem: function(
key: string,
callback?: ?(error: ?Error, result: ?string) => void,
): Promise {
invariant(RCTAsyncStorage, 'RCTAsyncStorage not available');
return new Promise((resolve, reject) => {
RCTAsyncStorage.multiGet([key], function(errors, result) {
// Unpack result to get value from [[key,value]]
const value = result && result[0] && result[0][1] ? result[0][1] : null;
const errs = convertErrors(errors);
callback && callback(errs && errs[0], value);
if (errs) {
reject(errs[0]);
} else {
resolve(value);
}
});
});
},
我們就這樣封裝下
function get(name = STORAGE_KEY.Unknown) {
return new Promise((resolve, reject) => {
AsyncStorage.getItem(name, function (error, result) {
if (error) {
reject(`讀取失敗证芭,讀取結果為 ${error}`);
} else {
try {
let obj = JSON.parse(result);
if (obj !== null && typeof obj === 'object') {
resolve(obj);
} else {
let msg = `反序列化 AsyncStorage 失敗【${name}】,讀取結果為 ${result}`;
console.log(msg);
reject(msg);
}
} catch (err) {
let msg = `反序列化 AsyncStorage 異车S常【${name}】废士,讀取結果為 ${err}`;
console.log(msg);
reject(msg);
}
}
});
});
}
當然這都是部分使用,更多的請查看官方文檔另萤。