Javascript 如果承诺链中有多行代码,则获取未定义的错误

Javascript 如果承诺链中有多行代码,则获取未定义的错误,javascript,node.js,promise,Javascript,Node.js,Promise,我正在做一个不同的基本承诺演示代码。 有人能解释一下为什么下面的代码块给出未定义的代码吗?任何帮助都将不胜感激 这是我的承诺定义代码。我创建了三个函数,每个函数都返回一个承诺。目前,iam在示例中使用setTimeout //promise-definitions.js const definitions = { getUser : (id) => { return new Promise((resolve, reject) => {

我正在做一个不同的基本承诺演示代码。 有人能解释一下为什么下面的代码块给出未定义的代码吗?任何帮助都将不胜感激

这是我的承诺定义代码。我创建了三个函数,每个函数都返回一个承诺。目前,iam在示例中使用setTimeout

//promise-definitions.js

const definitions = {
    getUser : (id) => {
        return new Promise((resolve, reject) => {
            setTimeout(()=> {
                console.log('Getting User data...');
                resolve({id: id, userName: 'Shamik Roy'})
            }, 2000);
        })
    },
    getRepos : (user) => {
        return new Promise((resolve, reject) => {
            setTimeout(()=> {
                console.log('Getting repositories List...');
                resolve(['repo1', 'repo2']);
            }, 2000);
        });
    },
    getCommits: (repoId) => {
        return new Promise((resolve, reject) => {
            setTimeout(()=>{
                console.log('Getting commit List...');
                resolve([{ id: 1, commit: "First Commit"},{ id:2, commit: "Second Commit"}]);
            }, 2000);
        })
    }
module.exports = definitions;
//promise-consumer.js 以下方法在这一行中给出了未定义的参数:console.log('Repository Data',repos)

但是,以下方法效果良好:

const promise = require('./promise-definitions');
promise.getUser(10)
    .then((user)=> {
        console.log('User Data', user);
        return promise.getRepos(user.userName);
    })
    .then((repos) => {
        console.log('Repository Data', repos);
        return promise.getCommits(repos[0]);
    })
    .then(commits => {
        console.log('Commits', commits)
    })
我在打电话给个人承诺时使用了一个返回声明,它工作正常。请任何人指出原因

有人能指出原因吗

在最高层次上,这仅仅是因为承诺链就是这样设计的。当您按照设计的工作方式实现它时,您将得到预期的结果。如果你不这样做,你就不会得到你想要的结果

承诺链上的
.then()
处理程序只调用其回调并查看返回值。如果您提供了一个不返回任何内容或不返回承诺的回调,那么承诺链将继续正常运行。
.then()
基础结构根本不知道您提供的回调中发生了什么。它没有神奇的能力知道您在
处理程序中启动了一些异步操作。然后()
处理程序应该神奇地等待它。相反,它知道等待某件事情完成的唯一方法是从
.then()
处理程序返回承诺。这就是承诺的设计方式

在第一个示例中,您调用了一些返回承诺的函数,但由于您没有从
.then()
处理程序返回承诺,因此父承诺链对您的新承诺一无所知

您实际上刚刚创建了一个新的分支承诺链,它与原始承诺链没有任何连接。这个新的承诺链按照自己的时间表进行,不会以任何方式影响原始承诺链


在第二个代码块中,从
.then()
处理程序返回新的承诺。这会将新承诺正确地插入到现有承诺链中,父承诺链等待新返回的承诺履行,然后再继续其链的其余部分。显然,这就是将承诺正确地链接在一起的方式。

因为链中的每个函数都要求前一个函数返回某些内容。您正在调用
promise.getCommits(repos[0])在函数中,但如何处理它?为什么你认为js会将这一行的结果传递给下一个
然后
,而你没有告诉它这样做?
const promise = require('./promise-definitions');
promise.getUser(10)
    .then((user)=> {
        console.log('User Data', user);
        return promise.getRepos(user.userName);
    })
    .then((repos) => {
        console.log('Repository Data', repos);
        return promise.getCommits(repos[0]);
    })
    .then(commits => {
        console.log('Commits', commits)
    })