Результат обещания и его обработка в два отдельных файла - PullRequest
0 голосов
/ 26 июня 2018

В моем скрипте мне нужно сделать XML-запрос, получить ответ от сервера (если разрешен), проанализировать его и поместить проанализированный результат в переменную.

Только позже, с этой переменной я могу делать много вещей.

Итак, я пытаюсь отделить создание такого объекта синтаксического анализатора от остальной части моего кода, чтобы:

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

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

Если все в порядке, я бы поместил это в отдельный файл, чтобы иметь возможность его импортировать, и позвонил бы testing() (или какому-либо другому имени) из любого места, где мне нужно.

function delay(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

function testing() {delay(5).then(result => {return document.write(result)})};

testing();

EDIT

Хорошо, я думаю, что столкнулся с проблемой благодаря ответу @DrewReese и ссылкам в комментариях.

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

function delay(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

function testing() {delay(5).then(result => {return result})};

var test = testing();
document.write(test);

Так что в этом случае я знаю, что при определении test вывод равен 'undefined', потому что Обещание в testing() еще не разрешено.

Проблема, которую я пытаюсь решить, заключается в следующем: есть ли (если таковые имеются) способ определить тест только тогда, когда Обещание разрешено, не заключая его в then() и, возможно, вывести что-то другое, когда оно не решено (например, " ЗАГРУЗКА ... ").

Я не знаю, в принципе, возможно ли проверить, есть ли у переменной значение Promise в ожидании и вывести два разных значения: когда она ожидает и когда она разрешена / отклонена.

Надеюсь, я был достаточно ясен, иначе я протестирую больше и при необходимости вернусь с другим вопросом.

1 Ответ

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

Весь смысл обещаний (цепочек обещаний) состоит в том, чтобы вырваться из "адского гнезда", сгладив вашу "цепочку", поэтому да, когда ваша цепочка обещаний разрешает блоки кода, она возвращает обещание, которое then -able. Я надеюсь, что это помогает проиллюстрировать:

someAsyncHttpRequest(parameter) // <- Returns Promise
    .then(result => {
        // do something with result data, i.e. extract response data, 
        //  mutate it, save it, do something else based on value
        ...
        // You can even return a Promise
        return Promise.resolve(mutatedData);
    })
    .then(newData => {  // <- mutadedData passed as parameter
        // do new stuff with new data, etc... even reject
        let rejectData = processNewData(newData);
        return Promise.reject(rejectData);
    })
    .catch(err => {
        console.log('Any caught promise rejection no matter where it came from:', err);
    })
    .finally(() => {// You can even run this code no matter what});

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

asyncFunction = async (parameter) => {
    let asyncValue;

    await someAsyncHttpRequest(parameter)
        .then(result => {
            ...
            asyncValue = someValue;
            ...
        });
    // safe to use asyncValue now
};

Так что для вас:

function delay(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

**async** function testing() { // Declare this an asynchronous function
    let value = **await** delay(5); // Now you can await the resolution of the Promise
    console.log(value); // Outputs resolved value 15!
    return value; // Just returns resolved Promise
}

var test = testing();

console.log(test); 
/** Outputs the Promise!
   Promise {<pending>}
     __proto__:Promise
     [[PromiseStatus]]:"resolved"
     [[PromiseValue]]:15
*/

test.then(console.log)); // Outputs returned resolved value, 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...