我以前对需要访问mysql或txt文件的所有nodejs函数使用了回调。这导致丑陋的代码将回调相互堆叠在一起,因此我将它们转换为Promise。如何每次都将具有不同参数的承诺链接在一起?
我知道如何用.then()
链接它们,但是我不知道每次都传递不同的参数。
app.get('/visual', function (request, response) {
loadTextFile('tables', function (measureList) {
loadTextFile('roles', function (roleList) {
// Do something with roleList and measureList
});
});
});
这是我的代码在使用回调之前的样子,如何将它们转换为使用then()
? (我知道如何将loadTextFile转换为Promise。)
答案 0 :(得分:2)
开始使用async
-await
:
async function loadFiles() {
const loadTextFilesTables = await loadTextFile('tables', measureList);
const loadTextFilesRoles = await loadTextFile('roles', roleList);
//...
}
答案 1 :(得分:1)
作为回调地狱和Promise.then.then
的另一种选择,您还可以为此使用async / await:
const loadTextFile = file => new Promise( (resolve, reject) => {
// Fetch the files etc.
resolve(data);
})
const loadFiles = async (request, response) => {
const measureList = await loadTextFile('tables');
const roleList = await loadTextFile('roles');
// Do something with roleList and measureList
response.send(finalData);
}
app.get('/visual', loadFiles);
答案 2 :(得分:1)
正如其他人已经说过的那样,您应该使用async / await,因为其可读性优于Promises /回调,但是我想补充一点,如果您的Promises彼此不依赖,则可以实际请求它们两者同时进行,而不是等待Promise.all
发出下一个请求之前完成const loadTextFile = file => new Promise((resolve, reject) => {
const fileData = getFileData(file);
resolve(data);
}
const loadFiles = async () => {
const [measureList, roleList] = await Promise.all([
loadTextFile('tables'),
loadTextFile('roles')
]);
};
答案 3 :(得分:0)
如果您的意思是这样的话:
function multiply(a) {
return new Promise((resolve, reject) => {
resolve(a * a)
})
}
function promise1() {
return new Promise((resolve, reject) => {
resolve(5)
})
}
promise1.then(add).then(res => console.log(res))
那么答案是肯定的。