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"]