首页 > 解决方案 > Javascript Promise:无法从我的函数中获取返回值

问题描述

我无法从我的函数中获取返回对象,因此我可以在下一个函数中重用它,该函数应该由我的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()
    })
}

标签: javascriptfunctionecmascript-6promisees6-promise

解决方案


Javascript 承诺是异步的。这意味着它们在事件循环中被解决,如果承诺在您调用.then()回调后立即解决,那么您将按预期在下一个函数中获得值。

Javascript 承诺是异步的,因为典型的 API 调用或数据库检索可能涉及网络延迟或返回数据的任何其他延迟。因此,用户会将这些延迟视为性能问题。为了避免这种影响,Javascript事件循环正在执行异步运行 Promise 的工作。这意味着承诺之后的代码很可能在它被解决或拒绝之前运行。因此,您的下一个函数在其代码运行时将不具有第一个承诺的值。在事件循环的下一次迭代或 1+ 次迭代中,您的承诺可能会被解决/拒绝,然后可能已经填充了相应的值。

解决方案 =>

您应该使用 async await 使任何异步代码在 javascript 中同步。

你可以在这里阅读更多关于它的信息。 https://javascript.info/async-await


推荐阅读