promise中的then方法
每一個promise物件都會提供一個then方法或者是catch方法
somePromise().then(function () {
// I'm inside a then() function!
});
複製程式碼
我們在這裡能做什麼呢?有三種事可以做:
1.返回另一個promise;
2.返回一個同步值(或者undefined
3.丟擲一個同步錯誤。 理解這三種情況之後,你就會理解promise了。
參考 blog.xinshangshangxin.com/2015/09/29/…
假設我們需要的執行順序是p1 p2 p3
var p1 = new Prmoise((reslove, reject) => {
wx..getUserInfo({
success:function(data) {
console.log('p1')
reslove(data);
},
fail: function(data) {
reject(data);
}
})
})
function p2(param){
new Prmoise((reslove, reject) => {
wx..getLocation({
success:function(data) {
console.log("p2")
reslove(data);
},
fail: function(data) {
reject(data);
}
})
})
}
p1.then((res) => {
p2(res); 注意行
}).then(() => {
console.log('p3')
})
複製程式碼
現在注意行沒有return,這個時候then裡面不返回或者返回同步程式碼就會直接resolve,因為p2是非同步的,所以列印順序為p1 , p3, p2
解決辦法是加上return
p1.then((res) => {
return p2(res); 注意行
}).then(() => {
console.log('p3')
})
複製程式碼
也就是說then裡面應該返回promise才能執行正常的reslove reject邏輯
Promise.all兩種傳參方式
最近幾個需求遇到的問題都是用promise.all完美解決。那麼,什麼時候需要用這個方法呢?
1 當需要多個非同步請求返回的結果時
function getLocation() {
return new Promise((resolve) => {
geolocation.getLocation({
success: function (data) {
console.log('succ', JSON.stringify(data))
resolve(data)
},
fail: function () {
let data = {
latitude:0,
longitude:0
};
resolve(data)
}
});
})
}
function getPhone() {
return new Promise((resolve) => {
storage.get({
key: 'phone',
success:function(data){
resolve(data);
},
fail: function() {
let data = "";
resolve(data)
}
})
})
}
const phone = getPhone();
const location = getLocation();
Promise.all([phone, location]).then(([phone, location]) => {
var c = Object.assign({}, {
"phone": phone,
"cid": type,
"uid": info.product,
"lat": location.latitude,
"lgt": location.longitude
});
}
複製程式碼
phone和location作為引數傳遞給then方法,然後就可以獲取這些引數進行下一步操作了。
2 但是promise.all正常的是將前面的引數合併成為一個陣列傳遞給then裡面的第一個引數
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
複製程式碼