解决顺序错误的承诺

时间:2019-10-15 10:41:12

标签: javascript node.js asynchronous es6-promise

我正在兑现承诺,并修改了Medium中的脚本。

当我运行脚本时,它会提示您输入代码,然后在我可以输入值之前显示json数据。然后,我输入一个值而不提示脚本退出。

如何在API调用起作用之前获取输入?


'use strict'

const request = require('request')
const readline = require('readline')
let userDetails

const getInput = prompt => new Promise( resolve => {
    const io = { input: process.stdin, output: process.stdout }
    const read = readline.createInterface(io)
    read.question(`${prompt}: `, data => {
        console.log(data)
        read.close()
        resolve(data)
    })
})

const getData = () => new Promise( (resolve, reject) => {
    const options = {
        url: 'https://api.github.com/users/marktyers',
        headers: {
            'User-Agent': 'request'
        }
    }
    // Do async job
    request.get(options, (err, resp, body) => {
        if (err) reject(err)
        else resolve(JSON.parse(body))
    })
})

function main() {
    const GitHubAPICall = getData()
    const getBase = getInput('input base currency')
    GitHubAPICall
        .then(result => {
            userDetails = result
            console.log('Initialized user details')
            console.log(userDetails)
        }).then(getBase)
        .catch(err => console.log(err))
}

main()

1 个答案:

答案 0 :(得分:0)

在主要功能中,您可以这样操作:

function main() {
    const GitHubAPICall = getData; // WITHOUT ()
    const getBase = getInput; // Those 2 declarations are useless, btw

    GitHubAPICall()
        .then(result => {
            userDetails = result
            console.log('Initialized user details')
            console.log(userDetails)
        })
        .then(() => getBase())
        .then(data => // Do something with the data returned by 'getInput')
        .catch(err => console.log(err))

}