Promise
var promise = new Promise((resolve,reject)=>{
resolve(value);
//reject(value)
});
//promise的狀態由內部是否執行resolve(),reject(),或者報錯決定
promise.then(value=>{
return value //等價於return Promise.resolve(value) 此時狀態由pendding變為resolved
//return new Promise((resolve,reject)=>{}) 如果此時內部未執行resolve(),reject(),或者報錯,promise.then返回的對象就是pendding狀態
})
//這個方法返回一個promise對象,這個對象和promise不相等,這個promise的狀態,由return決定
//如果return的是一個值,或者沒有return(返回的是undefined),此時狀態由pendding變為resolved
var promise = new Promise((resolve,reject)=>{
console.log(1);
resolve();
});
promise.then(()=>{
return Promise.all[new Promise(
(resolve,reject)=>{
console.log(2)
resolve();
}
),new Promise(
(resolve,reject)=>{
console.log(3)
resolve();
}
)]
}).then(()=>{
console.log(4)
})
promise.then(()=>console.log('end'))
// 1 2 3 end 4 1 2 3 end返回的promise都是基於 promise的,4基於的是promise.then(),事件隊列的排列順序是1,2,3,end,4
async function logInOrder(urls) {
// 並發讀取遠程URL
const textPromises = urls.map(url => {
return function(){
return new Promise((reslove)=>{
setTimeout(()=>reslove(url),1000);
});
};
});
let reslt=[];
// 按次序輸出
for (const textPromise of textPromises) {
reslt.push(await textPromise());//此時才執行new Promise,執行定時器,await沒有返回結果是不會執行后面的console.log的
console.log(reslt);
}
}
async
async function logInOrder(urls) {
// 並發讀取遠程URL
const textPromises = urls.map(url => {
return new Promise((reslove)=>{
setTimeout(()=>reslove(url),1000);
});
});
let reslt=[];
// 按次序輸出
for (const textPromise of textPromises) {
reslt.push(await textPromise);//在map(非常快)的時候定時器已經開啟,await只是等待resolve的執行,恰好遍歷的定時器時間一樣,並行打印
console.log(reslt);
}
}
var promise = new Promise((resolve,reject)=>{
resolve(url1);
});
if(false){ //或者true,可以用promise賦值的方式將新的promise的結果傳給下面的then
promise = promise.then(value=>{
return new Promise((resolve)=>{
resolve(url2)
})
})
}
promise.then((value)=>{
})
擴展我自己寫的一個Promise.props方法
// 直接在構造方法上定義靜態方法
Promise.props = function(obj) {
if (typeof obj !== 'object') return new Promise((resolve)=>resolve(obj));
let keys = Object.keys(obj);
return Promise.all(keys.map(item=>obj[item])).then((value) => {
let foo={};
value.forEach((v,i)=>foo[keys[i]] = v);
return foo
});
}
Promise.props({
a: new Promise((resolve) => {
setTimeout(() => resolve(123), 1000)
}),
b: new Promise((resolve) => {
setTimeout(() => resolve(456), 1000)
})
}).then(value => console.log(value.a, value.b))