我是node.js的新手,我在删除bookshelf.js函数中的多个嵌套.then()时遇到了问题。
以下代码就是我现在正在处理的问题。它现在工作正常,但我需要添加20多个嵌套.then()来完成项目。因此,我试图在它变得疯狂之前将.then()替换为其他方法。
任何帮助或提示都将不胜感激。
getItem: function (req, res, next) {
DepartmentCollection.forge()
.fetch({
debug: true
})
.then(function(collection) {
new GlossaryTerm({'GlossaryTermID': req.params.id}).fetch({
withRelated: ['department'],
debug: true
})
.then(function(model) {
if ("undefined" === typeof collection) { console.log("step 2: variable is undefined") }
else { console.log("step 2: variable is defined") };
res.render('glossary/glossary-term-detail',{domain:'GlossaryTerm', title: 'Glossary Term Detail',
data: model, department_data: collection });
}).catch(function(error) {
console.log(error);
res.send('An error occured');
});
}).catch(function(error) {
console.log(error);
res.send('An error occured');
});
}
答案 0 :(得分:0)
我强烈推荐co库。
npm install co --save
然后你可以让这些电话出现'同步并避免一些厄运类型问题的金字塔。
const co = require('co');
co(function* () {
const resultOne = yield asyncCallOne();
const resultTwo = yield asyncCallTwo();
try {
const resultThree = yield asyncCallThree();
} catch (error) {
console.log(error);
}
// and so on, and so on.
});
答案 1 :(得分:0)
通常你不需要嵌套。 thenable的结果成为下一个的输入。所以大多数时候你可以链而不是嵌套:
getItem: function (req, res, next) {
// Creating a closure for storing intermediate then() results
let collection;
// Making getItem() a promise itself
return DepartmentCollection
.forge()
.fetch({
debug: true
})
.then(function(fetched_collection) {
collection = fetched_collection;
if ("undefined" === typeof collection) {
console.log("step 2: variable is undefined")
} else {
console.log("step 2: variable is defined")
}
return new GlossaryTerm({'GlossaryTermID': req.params.id})
.fetch({
withRelated: ['department'],
debug: true
});
})
.then(function(model) {
res.render('glossary/glossary-term-detail', {
domain:'GlossaryTerm',
title: 'Glossary Term Detail',
data: model,
department_data: collection });
})
.catch(function(error) {
console.log(error);
res.send('An error occured');
});
}
例外情况是必须将逻辑拆分为更多使用不同方式提供结果的链。在这些情况下,建议将复杂逻辑移动到另一个函数(返回一个promise):
所以这个
function complex() {
return f1()
.then(x => {
if (!x) {
return f2()
.then(f3);
}
return f3();
})
.then(...);
}
成为这个:
function complex() {
function f4(x) {
if (!x) {
return f2()
.then(f3);
}
return f3();
}
return f1()
.then(f4)
.then(...);
}