承诺以错误的顺序解决

Promises resolving in wrong order

我正在玩弄 promises 并修改了来自 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()

在你的主函数中,你可以这样做:

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))

}