Các phương thức tĩnh (static method) của lớp đối tượng Promise bao gồm:

  • Promise.resolve
  • Promise.reject
  • Promise.all

Promise.resolve And Promise.reject

Có thể sử dụng phương thức Promise.resolve hoặc Promise.reject để đảm bảo chắc chắc rằng promise sẽ được resolved (hoặc rejected):

const fulfilled = Promise.resolve(returnValue)
const rejected = Promise.reject(returnValue)

Promise.all

Xét trường hợp nếu chúng ta muốn thực hiện nhiều tác vụ song song, ta có thể cân nhắc dùng Promise.all.

Chẳng hạn có hai promise dưới đây và nhiệm vụ của chúng ta là hợp nhất hai mảng trả về khi nhận được kết quả.

const promise1 = new Promise((resolve) => {
    setTimeout(() => {
        resolve([1])
    }, 2000)
})
 
const promise2 = new Promise((resolve) => {
    setTimeout(() => {
        resolve([2, 3])
    }, 5000)
})

Hai promise này nếu chạy tuần tự sẽ tốn 7s. Do đó ta sẽ chia ra nhiều luồng công việc để chúng có thể làm việc song song và chỉ tốn 5s.

Sử dụng phương thức Promise.all, đối số truyền vào là mảng các promise không quan tâm thứ tự. Giá trị trả về là một promise, do đó có thể sử dụng phương thức then.

Promise.all([promise1, promise2])
    .then((results) => {
        let a = results[0]
        let b = results[1]
 
        console.log(a.concat(b)) // [1, 2, 3]
    })
    .catch((error) => console.log(error))

Chú ý rằng, các promise đối số đều phải chạy xong thì phương thức then mới được gọi thực thi. Và do có nhiều giá trị trả về, giá trị của results sẽ là mảng các giá trị trả về có thứ tự phụ thuộc vào thứ tự các promise truyền vào.

Nếu như một trong số các promise có trạng thái là rejected, Promise.all sẽ ngay lập tức trả về và results sẽ chỉ bao gồm kết quả trả về của promise đó.

Khi đó, tất cả các promise khác dù có trạng thái là fulfilled thì cũng không được trả về.

Giả sử ta có các promise sau:

const resolvedPromise = Promise.resolve("resolved")
const rejectedPromise = Promise.reject("rejected")
const anotherResolvedPromise = Promise.resolve("resolved")

Ta sử dụng Promise.all như sau và thu được kết quả trả về là “rejected”.

Promise.all([resolvedPromise, rejectedPromise, anotherResolvedPromise])
    .then((results) => {
        console.log(results) // "reject"
    })
    .catch((error) => {
        console.log(error)
    })

Summary

Có thể nói, phương thức Promise.all tương tự như toán tử &&:

  • Nếu toàn bộ các promise được resolve thì kết quả trả về sẽ kết quả của các fulfilled promise.
  • Nếu có một promise bị reject thì kết quả trả về sẽ là kết quả của rejected promise.

Promise.allSettled

Tương tự với Promise.all, Promise.allSettled cũng nhận đối số là một mảng các promise và chạy các promise song song với nhau.

Tuy nhiên, giá trị trả về của phương thức này lại là mảng các object lưu trạng thái và dữ liệu trả về của các promise.

Xét các promise sau:

const resolvedPromise = Promise.resolve("resolved")
const rejectedPromise = Promise.reject("rejected")
const anotherResolvedPromise = Promise.resolve("resolved")

Ta gọi phương thức allSettled:

Promise.allSettled([resolvedPromise, rejectedPromise, anotherResolvedPromise])
    .then((results) => {
        console.log(results)
    })
    .catch((error) => {
        console.log(error)
    })

Kết quả xuất ra console sẽ là:

[
	{ status: 'fulfilled', value: 'resolved' },
	{ status: 'rejected', reason: 'rejected' },
	{ status: 'fulfilled', value: 'resolved' }
]

Summary

Phương thức Promise.allSettled có đối số là mảng các promise và có giá trị trả về là mảng các đối tượng, mỗi đối tượng gồm hai thuộc tính:

  • status: lưu trạng thái của promise.
  • value hoặc reason: lưu giá trị của resolved promise hoặc lý do mà rejected promise bị rejectd.

Promise.any

Trái ngược với Promise.all, phương thức Promise.any sẽ trả về giá trị của fulfilled promise khi có bất kỳ một promise nào được resolve.

table tags as Tags, file.cday as Created
from [[Promise Static Methods]]
sort file.ctime asc