Вернуть результат Promise вместо Promise в Nodejs

Фон

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

проблема

Изучая, как связывать обещания, я не понимаю, почему кто-то предпочел бы вернуть обещание, а не возвращать его стоимость.

Возьмите следующий пример, который использует цепочку обещаний:

let myObj = new MyClass();

myObj.getInfo()
    .then(result => writeOutput(FILE_NAME, result))
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

class MyClass{

    getInfo() {
        return new Promise(function(fulfil, reject) {
            fulfill("I like bananas");
        });
}

Здесь я должен 2 раза. Но если бы я должен был напрямую вернуть результат из метода getInfo() вместо того, чтобы вернуть обещание, я мог бы сделать что-то вроде следующего:

let myObj = new MyClass();

let str = myObj.getInfo();

writeOutput(FILE_NAME, str)
    .then(console.log(FILE_NAME + " complete"))
    .catch(error => console.error(error));

Вопросы

Итак, как вы можете видеть, я немного смущен.

  1. При условии getInfo() на самом деле является асинхронным, возможно ли добиться кода, аналогичного тому, что был в моем втором примере кода?
  2. Если бы это было возможно, было бы хорошей идеей? Как бы вы это сделали?

4 ответа

Решение

Вы можете вернуть значение из какой-либо функции только в том случае, если это значение сразу доступно при вызове этой функции (в тот же тик цикла событий). Помни что return синхронно

Если он недоступен сразу, вы можете только вернуть обещание (или вы можете использовать обратный вызов, но здесь вы конкретно спрашиваете об обещаниях).

Более подробное объяснение см. В этом ответе, который я написал некоторое время назад на вопрос о том, как вернуть результат вызова AJAX из какой-либо функции. Я объяснил, почему вы не можете вернуть значение, но вы можете вернуть обещание:

Вот еще один связанный ответ - по какой-то причине за него проголосовали, но я думаю, что он объясняет похожую проблему, которую вы спрашиваете о ней:

Я не понимаю, почему кто-то предпочел бы вернуть обещание, а не вернуть его стоимость.

Потому что у вас еще нет значения.

При условии getInfo() на самом деле является асинхронным, возможно ли добиться кода, аналогичного тому, что был в моем втором примере кода?

Если он асинхронный, он должен вернуть обещание.

Синтаксис, который избегает then звонки (но все еще использует и производит обещания) стало возможным благодаря async /await:

async function writeInfo(FILE_NAME) {
    const myObj = new MyClass();
    try {
        const str = await myObj.getInfo();
        await writeOutput(FILE_NAME, str);
        console.log(FILE_NAME + " complete");
    } catch (error) {
        console.error(error);
    }
}
writeInfo("…");

Еще один способ взглянуть на первый вопрос ("зачем кому-то..."):

Когда вы звоните .then или же .catch в обещании ожидающее обещание, возвращаемое после вызова, добавляется в конец существующей цепочки обещаний. (Разрешение "существующей цепочки" может содержать только одно обещание).

Когда вы решаете (а не "выполняете", вы не можете выполнить обещание с обещанием) обещание с обещанием, обещание, используемое в разрешении, вставляется во главе того, что остается в цепочке обещаний.

Обещание, используемое в резолюции, должно быть выполнено со значением до следующего .then или же .catch пункт в цепочке называется.

Цель обещания состоит в том, чтобы сказать: "Когда-нибудь будут данные, просто продолжайте кодирование", чтобы ваша страница не застряла, например. В основном вы используете Promises, например, для загрузки чего-либо с сервера.

Другие вопросы по тегам