對es6中Promise和async的理解


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))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM