百度搜索 mdn promise
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
Promise 基本用法,模拟请求 数据
function myAsyncTask(time) {
var promise1 = new Promise(function (success, failure) {
// 模拟异步请求数据
setTimeout(function () {
// 拿到一个随机数的整数
let num = Math.round(Math.random() * 100);
// 这个整数是否能被2整除
let yu = num % 2;
if (yu == 0) {
// 能整除,成功
success('数据请求成功');
console.log('******success');
} else {
// 不能整除,失败
failure('数据请求失败')
console.log('******failure');
}
}, time);
});
return promise1;
}
// 接收请求成功或失败的数据
myAsyncTask(3000)
.then(
function (success) {
console.log(success);
}, function (failure) {
console.log(failure);
});
连续 then 执行
//把请求结果传到这里
myAsyncTask(3000)
.then(
function (success) {
console.log(success);
}, function (failure) {
console.log(failure);
})
.then(
// 上面的then执行完了,无论成功失败,这里立即执行成功的函数,数据传不过来
function (success) {
console.log(`上面执行完了,执行这里>>>${success}`);
}
);
请求完成后,继续请求数据
myAsyncTask()
.then(
function (success) {
console.log(success);
// 数据请求成功,则第二次请求数据
return myAsyncTask();
}, function (failure) {
console.log(failure);
// 数据请求失败,则第二次请求数据
return myAsyncTask();
})
.then(
function (success) {
console.log(`第二次请求数据的返回值${success}`);
}, function (failure) {
console.log(`第二次请求数据的返回值${failure}`);
}
);
Promise.all 多个异步任务,同时执行
let promise1 =myAsyncTask(3000);
let promise2 =myAsyncTask(6000);
// 两个异步任务同时执行
let promiseAll=Promise.all([promise1,promise2]);
promiseAll.then(
// 所有异步任务成功,返回到这里,打印所有任务返回的数据
function (success) {
console.log(`所有任务执行成功>>>${success}`);
}, function (failure) {
// 有一个不成功返回到这里,打印这个失败信息
console.log(`有一个任务被拒绝>>>${failure}`);
}
);
Promise.race 第一个任务成功或者失败,就返回
//race 第一个任务成功或者失败,就返回
let promise1 = myAsyncTask(3000);
let promise2 = myAsyncTask(6000);
// 两个异步任务同时执行
let promiseRace = Promise.race([promise1, promise2]);
promiseRace.then(
function (success) {
// 多个任务,第一个成功返回这里,其它的不返回了
console.log(`有一个执行成功>>>${success}`);
}, function (failure) {
// 多个任务,第一个失败返回这里,其它的不返回了
console.log(`失败>>>${failure}`);
}
);
Promise 依次执行多个任务
// Promise 依次执行多个任务
function myAsyncTask1() {
var promise1 = new Promise(function (resolve, reject) {
// 模拟异步请求数据
setTimeout(function () {
console.log('第一次调用');
resolve({ data: 'first' });
}, 3000);
});
return promise1;
}
function myAsyncTask2() {
var promise2 = new Promise(function (resolve, reject) {
// 模拟异步请求数据
setTimeout(function () {
console.log('第二次调用');
resolve({ data: 'second' });
}, 3000);
});
return promise2;
}
function myAsyncTask3() {
var promise3 = new Promise(function (resolve, reject) {
// 模拟异步请求数据
setTimeout(function () {
console.log('第三次调用');
resolve({ data: 'thrid' });
}, 3000);
});
return promise3;
}
function result(data) {
console.log(data);
}
// 依次调用,调第一个成功,调第二个成功,调第三个成功
myAsyncTask1()
.then(result)
.then(myAsyncTask2)
.then(result)
.then(myAsyncTask3)
.then(result);
Promise 使用 for 循环,依次执行多个任务
// Promise 使用 for 循环,依次执行多个任务
var tasks = [
{ name: '张1', time: 1000 },
{ name: '张2', time: 1000 },
{ name: '张3', time: 1000 },
{ name: '张4', time: 1000 },
{ name: '张5', time: 1000 },
{ name: '张6', time: 1000 },
];
function iAsyncTask(person) {
var promise = new Promise((resolve, reject) => {
// 模拟异步请求数据
setTimeout(function () {
resolve(person);
}, person.time);
});
return promise;
}
console.log('任务开始');
let promise = iAsyncTask(tasks[0]);
for (let i = 0; i < tasks.length; i++) {
// 把产生的对象赋值找这里,promiseReluet和promise,是同一对象
// promiseReluet是发消息,promise是接收消息,自己发的消息,自己才能接收到
promise = promise.then(msg => {
console.log(msg);
if (i < tasks.length - 1) {
// 产生了一个对象
let promiseReluet = iAsyncTask(tasks[i + 1]);
return promiseReluet;
} else {
console.log('任务全部完成');
}
});
}