Javascript Обещание: не могу получить возвращаемое значение из моей функции - PullRequest
0 голосов
/ 27 января 2020

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

engine.log в основном эквивалентно console.log в моем приложении.

firstRequest
    .then( function (result) {
            return secondRequest(result)
        },
        error => engine.log(error)
    )
    .then(
        result => engine.log(result), // result is undefined, need the object here
    )

let firstRequest = new Promise(function(resolve, reject) {
        http.simpleRequest({
            'method': 'GET',
            'url': theUrl,
            'dataType': 'json',
            'timeout': 6000,
        }, function (error, response) {
            if (error) {
                engine.log("Error: " + error)
                reject()
            }

            if (response.statusCode != 200) {
                engine.log("HTTP Error: " + response.status)
                reject()
            }

            myObject = JSON.parse(response.data)
            resolve(myObject)
        })
});

function secondRequest(request) {
    http.simpleRequest({
        'method': 'GET',
        'url': theSecondUrl,
        'dataType': 'json',
        'timeout': 6000,
    }, function (error, response) {
        if (error) {
            engine.log("Error: " + error);
        }

        if (response.statusCode != 200) {
            engine.log("HTTP Error: " + response.status);
        }

        myObject = JSON.parse(response.data)
        return myObject // this is not being returned, to the .then()
    })
}

Ответы [ 2 ]

1 голос
/ 27 января 2020

Во-первых, я вижу избыточный код, поэтому я бы объединил ваши запросы в одну более общую c функцию. Кажется, вы не хотите этого делать, если вы чувствуете, что должны передать параметр 'request' второй функции, но заметили, что вы никогда не используете его. Просто передайте URL в обоих случаях.

В вашей обобщенной функции c, которую я ниже называю makeRequest, обязательно верните обещание, иначе вы получите неопределенное значение. Кроме того, обязательно вызовите resolve для анализируемого объекта, а не return;

Кроме того, я бы использовал catch для ваших ошибок, так что вы будете ловить его всякий раз, когда происходит ошибка, будь то в первом then или во втором.

Между прочим, это не проверено, но я думаю, что здесь есть общие моменты.

makeRequest('somewhere')
.then(result => makeRequest('theSecondUrl'))
.then(result => engine.log(result))
.catch(error => engine.log(error));

function makeRequest (url, method, datatype, timeout) {

    return new Promise(function(resolve, reject) {

        http.simpleRequest({
            'method': method || 'GET',
            'url': url,
            'dataType': datatype || 'json',
            'timeout': timeout || 6000,
        }, function (error, response) {

            if (error) {
                engine.log("Error: " + error)
                reject()
            }

            if (response.statusCode != 200) {
                engine.log("HTTP Error: " + response.status)
                reject()
            }

            // use 'let' or else you've made a globally scoped variable
            let parsed = JSON.parse(response.data) 
            resolve(parsed);

        });

    })

}
1 голос
/ 27 января 2020

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

Javascript обещания асинхронные , поскольку типичные вызовы API или извлечение базы данных могут включать сетевые задержки или любые другие задержки для возврата данных. Таким образом, пользователи увидят эти задержки как проблемы с производительностью. Чтобы избежать такого эффекта Javascript событие l oop выполняет свою работу, выполняя обещания асинхронно . Значение кода после обещаний выполняется, скорее всего, до того, как он будет решен или отклонен. Поэтому ваша следующая функция не будет иметь значение первого обещания при запуске ее кода. На следующей итерации или 1+ итераций события l oop ваше обещание может быть разрешено / отклонено, а затем может быть заполнено соответствующим значением.

Решение =>

Вы должны использовать asyn c await, чтобы сделать любой асинхронный код синхронным в javascript.

Подробнее об этом можно прочитать здесь. https://javascript.info/async-await

...