大话promise

210 阅读2分钟

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

Promise.then