#javascript #es6-promise
#javascript #es6-обещание
Вопрос:
Я проверяю статические методы конструктора Promise. Когда я консольно регистрирую свойства конструктора Promise, я вижу методы resolve и reject:
console.log(Object.getOwnPropertyNames(Promise))
// Array(7) [ "all", "race", "reject", "resolve", "prototype", "length", "name" ]
Интересно, являются ли эти методы resolve и reject теми же методами, которые используются в executor в качестве его параметров, или это разные разные вещи:
const myFirstPromise = new Promise((resolve, reject) => {
// do something asynchronous which eventually calls either:
//
// resolve(someValue); // fulfilled
// or
// reject("failure reason"); // rejected
});
В спецификации упоминаются функции разрешения Promise и Promise.resolve ( x ), которые являются внутренним объектом %Promise_resolve% . Может кто-нибудь сказать мне, это то же самое?
Ответ №1:
Свойства, которые вы видите в выходных console.log()
данных, являются свойствами .resolve()
и .reject()
глобального Promise
объекта JavaScript. Вы можете рассматривать их как статические методы класса Promise
класса.
Они используются для создания новых Promise
объектов, которые уже разрешены / отклонены:
const p1 = Promise.resolve(3);
console.log(await p1);
// 3
Параметры promise
и reject
, которые вы используете в вызове:
const myFirstPromise = new Promise((resolve, reject) => {
if (rand() < 0.5) {
resolve(3);
} else {
reject(new Error('not today'));
}
});
это просто параметры функции. Они могут быть названы так, как вы хотите; они видны только в функции-исполнителе, которую вы передаете в качестве аргумента Promise
конструктору.
Они не связаны или не связаны каким-либо образом с Promise.resolve()
и Promise.reject()
.
Приведенный выше код также может быть записан как:
const f1 = (resolve, reject) => {
if (rand() < 0.5) {
resolve(3);
} else {
reject(new Error('not today'));
}
};
const myFirstPromise = new Promise(f1);
Таким образом, становится более понятным, что resolve
и reject
myFirstPromise
Promise
никоим образом не связаны ни с каким. Это просто локальные переменные функции f1
.
Комментарии:
1. Это многое объясняет. Я был немного смущен, как сказали спецификации
2. Функция разрешения обещаний — это анонимная встроенная функция, которая имеет [[Promise]] и [[AlreadyResolved]] внутренние слоты.
Ответ №2:
Promise.resolve
это ярлык для «взять значение или обещание и вернуть его в виде обещания». myPromise = Promise.resolve("myVal")
это более короткий способ
myPromise = new Promise((resolve) => resolve("myVal"))
Promise.reject делает то же самое, только явно отклоняет вместо разрешения.