#javascript #vue.js #ecmascript-6 #arrow-functions
#javascript #vue.js #ecmascript-6 #функции со стрелками
Вопрос:
У меня есть приведенный ниже код, но я не понимаю обозначения двойной стрелки, работает ли вторая функция стрелки, если ответ первой равен true? Когда использовалась эта нотация?
async check({ commit }) {
await axios.get('check')
.then((response) => {
console.log("try");
}, (response) => {
console.log("try2");
}
return true;
});
Комментарии:
1. это просто другой способ определения функции. Она введена в ES6
2. Это вопрос об обещаниях, а не о функциях со стрелками.
3. @tadman — Это вопрос об обещаниях, а не о функциях со стрелками, несмотря на внешний вид.
4. @T.J.Crowder Я полагаю, это можно прочитать как «двойная» стрелка, как в двух функциях со стрелками.
5. Функция, заключенная в кавычки, не имеет большого смысла и содержит синтаксические ошибки…
Ответ №1:
Это не имеет ничего общего с функциями стрелки. Это связано с then
методом в promises.
В then
методе promise первым аргументом является обработчик выполнения, а вторым — обработчик отклонения. Если обещание выполнено, вызывается первое со значением выполнения. Если обещание отклонено, вызывается второе с указанием причины отклонения. Будет вызван только один или другой (если любой), никогда оба (для одного и того же обещания).
Вот слегка отредактированная версия функции, частично показанная в qusetion, с некоторыми измененными именами и return true;
удаленным (потому что я не мог понять, где это должно было быть):
async check({ commit }) {
await axios.get('check')
.then(
(value) => { // ***
// Use the fulfillment value // *** fulfillment handler
}, // ***
(reason) => { // ***
// Deal with the rejection // *** rejection handler
} // ***
);
});
Смотрите MDN или спецификацию Promises A , на которой основаны обещания JavaScript.
Вероятно, стоит отметить, что нет особой причины делать эту конкретную функцию async
функцией, если только целью не является конкретно скрыть любое значение выполнения, которое может иметь обещание (или может предоставить обработчик отклонения). Тем не менее, она это делает, так что, возможно, в этом и заключается цель.
Комментарии:
1. Черт возьми, я довольно подробно описываю обещания (включая разницу между
.then(fn1, fn2)
и.then(fn1).catch(fn2)
) в главе 8 моей новой книги (иasync
/await
в главе 9); ссылки в моем профиле, если вам интересно.
Ответ №2:
Стандарт Promises / A гласит, что then
может принимать два аргумента:
promise.then(onFulfilled, onRejected)
Второй — это onRejected
обработчик.
Вы не видите это так часто, поскольку catch()
существует, но это все еще часть стандарта.