链接承诺,但参数不同

时间:2019-05-28 13:47:36

标签: javascript node.js es6-promise

我以前对需要访问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。)

4 个答案:

答案 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))

那么答案是肯定的。