Why use Promise

Since the asynchronous task can’t get the result directly, we pass a callback (function) to the asynchronous task, which is called when the asynchronous task completes and takes the result as an argument to the callback. But this method is prone to callback hell, and the code becomes unreadable, so use Promise.

The second usage

// This bool is used to help simulate success or failure
let bool=false
/ / encapsulation Promise
let fn=() = >{
    // Return the Promise instance
    return new Promise((resolve,reject) = >{
        if(bool){
            // Execute resolve successfully
            resolve('success');
        }else{
        	// Reject fails
            reject('failure'); }})}// Note that both successful and failed callback functions can take only one argument
fn().then(data= >console.log(data),error= >console.log(error))
// if bool is false, the callback fails. The value of the error parameter is "failed".
Copy the code

Other apis for Promise

  1. Promise.resolve(result)
// Make a success or failure
Promise.resolve(1).then(value= >console.log(value))
Promise.resolve(new Promise((resolve,reject) = >reject('Manufacturing failure'))).then(null.error= >console.log(error))
Copy the code

  1. Promise.reject(reason)
// Create a failure
Promise.reject(2).then(value= >console.log(value),error= >console.log('failure'))
Copy the code

  1. Promise.all(array)
// Wait for all to succeed, or for one to fail
Promise.all([Promise.reject('err1'),Promise.resolve(1)])
	.then(value= >console.log(value),error= >console.log(error))
Promise.all([Promise.resolve(1),Promise.reject('err2')])
	.then(value= >console.log(value),error= >console.log(error))
Promise.all([Promise.resolve(1),Promise.resolve(2)])
	.then(value= >console.log(value),error= >console.log(error))
Promise.all([Promise.reject('err3'),Promise.reject('err4')])
	.then(value= >console.log(value),error= >console.log(error))
Copy the code

  1. Promise.race(array)
// Wait for the first state to change
Promise.race([Promise.reject('err1'),Promise.resolve(1)])
	.then(value= >console.log(value),error= >console.log(error))
Promise.race([Promise.resolve(1),Promise.reject('err2')])
	.then(value= >console.log(value),error= >console.log(error))
Promise.race([Promise.resolve(1),Promise.resolve(2)])
	.then(value= >console.log(value),error= >console.log(error))
Promise.race([Promise.reject('err3'),Promise.reject('err4')])
	.then(value= >console.log(value),error= >console.log(error))
Copy the code

  1. Promise.allSettled(array)
//all interrupts if there is only one failure, but we want to get all results
//allSettled waits for all promise states to change
Promise.allSettled([Promise.reject('err1'),Promise.resolve(1)])
	.then(value= >console.log(value),error= >console.log(error))
// Implement promise.allSettled
Promise.allSettled2=(promiseList) = >{
    return Promise.all(promiseList.map(promise= >promise.then((value) = >{return {status:"ok",value}},(value) = >({status:"not ok",value}))))
}
Copy the code

Three written Promise. All

function all(promiseArray){
    return new Promise((resolve,reject) = >{
        if(!Array.isArray(promiseArray)){
            return reject(new Error('The argument passed in must be an array'));
        }
        let res=[];
        let counter=0;
        for(let i=0; i<promiseArray.length; i++){Promise.resolve(promiseArray[i]).then(value= >{
                counter++;
                res[i]=value;
                if(counter===promiseArray.length){
                    return resolve(res);
                }
            }).catch(
                e= >{
                    reject(new Error('failure')); })})}var promise1 = Promise.resolve(3);
var promise2 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100.'foo');
});
var promise3 = 42;

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
Copy the code

Four written Promise. Race

function race(promiseArray){
    return new Promise((resolve,reject) = >{
        if(!Array.isArray(promiseArray)){
            return reject(new Error('The argument passed in must be an array'));
        }
        for(let i=0; i<promiseArray.length; i++){Promise.resolve(promiseArray[i]).then(value= >{
                resolve(value)
            }).catch(
                e= >{
                    reject(new Error('failure')); })})}var promise1 = Promise.resolve(3);
var promise2 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100.'foo');
});
var promise3 = 42;

Promise.race([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
Copy the code