大話promise

西芹兒發表於2018-06-25

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



相關文章