与.then混淆

问题描述

我是JS新手,正在学习Promise。我想出了这段代码,它将打印每个函数的解析值,并使用.then

调用函数

function login() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {

            resolve({username : 'default'})
        },1000)
    })
}

function getVideos() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve(['vid1','vid2'])
        },1000)
    })
}

function getDesc() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {

            resolve('desc')
        },1000)
    })
}


const test = login()
test.then(res => {
    console.log(res)
    getVideos()
})
.then(res => {
    console.log(res)
    getDesc()
})
.then(res => console.log(res))

但是,我没有得到预期的结果,我认为.then()中的所有语句都需要执行并解决,才能继续执行下一个.then()语句。但是显然这里不是这种情况,因为我得到以下输出-

{ username: 'default' }
undefined
undefined

但是我希望输出类似于此-

{username : 'default}
['vid1','vid2']
desc

pls,指向我在这里出错的地方。感谢您的帮助,非常感谢

解决方法

调用这些函数时,需要在链中添加return。例如:

function login() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {

            resolve({username : 'default'})
        },1000)
    })
}

function getVideos() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve(['vid1','vid2'])
        },1000)
    })
}

function getDesc() {
    return new Promise((resolve,reject) => {
        setTimeout(() => {

            resolve('desc')
        },1000)
    })
}


const test = login()
test.then(res => {
    console.log(res)
    return getVideos()
})
.then(res => {
    console.log(res)
    return getDesc()
})
.then(res => console.log(res))

这是一个很好的指南:https://javascript.info/promise-chaining

,

进行一些非常小的更改:

const test = login()
test.then(res => {
  console.log(res)
  return getVideos()
})
.then(res => {
  console.log(res)
  return getDesc()
})
.then(res => console.log(res))

要将承诺链接在一起,您需要在每个步骤中返回承诺。因为是这样,所以您隐式返回undefined,这不是一个承诺。