Могу ли я «обещать» функцию, просто используя async? - PullRequest
0 голосов
/ 02 июня 2018

Итак, у меня есть функция, которая должна немедленно возвращать отклоненное или разрешенное обещание, то есть это в основном синхронная функция, которую я хочу «обещать».

То, что я обычно делаю в таких случаях, выглядит примерно так:

func() {
     // some code to check for an error
     if (hasError)
        return Promise.reject(new Error("Failure"));
     }
     return Promise.resolve("Success");
}

Теперь, когда в ES2017 есть функции "асинхронности", кажется, что я тоже могу сделать это:

async func() {
     // some code to check for an error
     if (hasError)
        throw new Error("Failure");
     }
     return "Success";
}

Так что я в основном использую async просто для "обещания""моя функция, без использования await в теле функции в любом месте.На мой взгляд, этот вариант должен быть точно таким же.Я прав или есть какие-то дополнительные побочные эффекты, о которых я не знаю здесь?

Я думаю, что предпочел бы этот паттерн, так как он немного короче, из одного только определения функции очень ясно, что онisync, и любые ошибки JavaScript (например, ошибки типа) также могут привести к отклонению, что заставит мой общий код реагировать более изящно в случае непредвиденных ошибок.

1 Ответ

0 голосов
/ 02 июня 2018

Всякий раз, когда вы объявляете асинхронную функцию , создается AsyncFunction объект, который в соответствии с MDN будет возвращать обещание:

обещание, которое будет разрешено со значениемвозвращается асинхронной функцией или отклоняется с неперехваченным исключением, выданным из асинхронной функции.

Так что, если использовать async, то обещает функцию.

Также давайте проведем некоторое тестирование;

async function fn(val) {
  console.log(val);
  if (val) {
    return "true";
  }
  throw new Error("false");
}

console.log(Object.getPrototypeOf(fn).constructor)

console.log(fn(true) instanceof Promise);
console.log(Object.getPrototypeOf(fn(true)).constructor)

console.log(fn(false) instanceof Promise);
console.log(Object.getPrototypeOf(fn(false)).constructor)

fn(true).then(val => console.log(val));

fn(false).catch(err => console.log("ERROR"));
...