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