【问题标题】:How to pass a resolved promise value to another function?如何将已解决的承诺值传递给另一个函数?
【发布时间】:2018-02-11 02:43:13
【问题描述】:

如何将返回的Promise 值传递给另一个函数?我需要检索已解析的 JSON 数据,然后使用该响应数据发送到 Slack 频道。

我的 index.js

// Get the data
let getData = () => {
    axios.get('https://jsonplaceholder.typicode.com/posts/1').then(res => {
        const responseJSON = res.data
        return responseJSON
    })
    .catch(err => {
        console.log(`Error in getData(): ${err}`)
    })
}

// Post to Slack (real-time)
let slack = () => {
    axios.post('url-to-post-to', {
            'text':  getData().toString() // This has to be a string, but right now it's returning [object Promise]
        })
        .catch(err => {
            console.error(`Error in SLACK: ${err.response.data}`)
        })
}

现在我在 Slack 频道中收到 [object Promise],但我需要以 string 形式返回的 JSON

我认为我正在尝试传递一个尚未解析的值,但问题是,我不知道如何传递解析后的值。

感谢任何帮助。

【问题讨论】:

    标签: json node.js axios


    【解决方案1】:

    在您第一次通话后插入您的 Slack 通话thenabled。您需要这样做,因为正如您所怀疑的那样,您正在进行 Slack 调用,结果是未履行的承诺。

    // Get the data
    let getData = () => {
        axios.get('https://jsonplaceholder.typicode.com/posts/1').then(res => {
            const respondeJSON = res.data;
            return responseJSON;
        }).then(data => {
            axios.post('url-to-post-to', {
                'text': data
            })
            .catch(err => {
                console.error(`Error in SLACK: ${err.response.data}`);
            });
        }).catch(err => {
            console.log(`Error in getData(): ${err}`)
        })
    };
    

    【讨论】:

    • 我需要在链中再添加一个.then()(第二个.then() 以便它最终有3 个.then()),因为它正在返回[object Object]。第二个.then() 是:.then(resData => { const returnedJSON = JSON.stringify(resData) return returnedJSON}),然后是.then(data => axios.post(...)。但是您和其他用户的回答让我更好地解释了如何从承诺中传递值。
    【解决方案2】:

    当使用 Promise 时,如果一个函数返回一个 Promise,你可以调用它的 then 属性,并且解析的值通过 then 参数传递。你可以的。

    // Get the data
    let getData = () => {
        return axios.get('https://jsonplaceholder.typicode.com/posts/1').then(res => {
            const respondeJSON = res.data
            return responseJSON
        })
        .catch(err => {
           console.log(`Error in getData(): ${err}`)
        })
    }
    
    // Post to Slack (real-time)
    let slack = () => {
        getData().then(data => 
        axios.post('url-to-post-to', {
               'text':  data.toString() 
             })
        .catch(err => {
            console.error(`Error in SLACK: ${err.response.data}`)
        }))
    }
    

    // Get the data
    let getData = () => {
        return axios.get('https://jsonplaceholder.typicode.com/posts/1').then(res => {
            const respondeJSON = res.data
            return responseJSON
        })
        .catch(err => {
           console.log(`Error in getData(): ${err}`)
        })
    }
    
    // Post to Slack (real-time)
    let slack = (data) => {
        axios.post('url-to-post-to', {
               'text':  data.toString() 
             })
        .catch(err => {
            console.error(`Error in SLACK: ${err.response.data}`)
        }))
    }
    
    getData().then(slack);
    

    【讨论】:

    • 这个和上面的答案,有效。我会赞成两者,但请验证更具可读性的一个。
    • 您的答案有效,但来自 Dez 的答案更短且更具可读性。如果我能验证 2 个答案,我也会验证你的。
    【解决方案3】:

    你可以将你的函数包装在async-await中。

    let slack = async () => {
        axios.post('url-to-post-to', {
                'text':  await getData().toString()
            })
            .catch(err => {
                console.error(`Error in SLACK: ${err.response.data}`)
            })
    }

    【讨论】:

    • invalid_payload
    • 根据节点版本,他可能没有可用的异步/等待。他需要默认使用 > v.8 或 v.7 后期版本 (> v.7.6.0)。 .
    • 可能是这样。
    • 它是v9.5.0。 2 人发布了他们的答案,他们的答案正在发挥作用。但我很感激你愿意帮助我。
    • 请检查更新的代码,如果它适合你。我添加了getData().toString() 而不是getData()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多