如何有效地使用JS Promisses?

时间:2017-02-24 00:06:25

标签: javascript promise

我没有在JS中正确使用promises。

我有3个异步的相互依赖的函数,如下所示:

func1,func2和func 3。

  • func1返回func2使用的单个结果。
  • func2也会返回单个结果
  • func3使用来自func1和func2的结果。

所以func3必须等待func1和2,而func2必须只等待func1。

这是我能够编写的JS小提琴并且它可以工作,但是阅读3在一起使用的混乱只是一个小问题。什么是执行这种连锁经营的正确方法?

function func1() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(10);
    }, 1000);
  });
}

function func2(return1) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(return1 + 20);
    }, 1000);
  });
}

function func3(val1, val2) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(val1 + val2);
    }, 1000);
  });
}

func1().then(function(result) {
  func2(result).then(function(result2) {
    func3(result, result2).then(function(finalResult) {
      console.log(finalResult);
    }, function(err) {
      console.log(err);
    });
  });
}).catch(function(err) {
  console.log(err);
});

2 个答案:

答案 0 :(得分:4)

只使用promises,你可以使用闭包范围并嵌套你的promises(这就是你正在做的事情),或者你可以将多个结果作为一个对象传递:

func1()
  .then((result) => {
    return func2(result).then((result2) => ({result, result2}));
  })
  .then(({result, result2}) => {
    return func3(result, result2);
  });

或者您可以将结果存储在所有承诺之外的范围内:

let result;

func1()
  .then((_result) => {
    result = _result;
    return func2(result);
  })
  .then((result2) => {
    return func3(result, result2);
  });

如果您的环境支持async/await functions,您可以像这样重写:

async function fn() {
  const result = await func1();
  const result2 = await func2(result);
  const result3 = await func3(result, result2);

  return result3;
}

fn().then((result3) => console.log(result3));

如果您的环境支持生成器,您可以使用co库来创建协同例程:

const fn = co.wrap(function*() {
  const result = yield func1();
  const result2 = yield func2(result);
  const result3 = yield func3(result, result2);

  return result3;
});

fn().then((result3) => console.log(result3));

答案 1 :(得分:0)

编辑:我误读了要求。 SimpleJ在这里的答案是要走的路。

then回调中返回的值本身是可以的。换句话说,您可以通过从前一个then回调中返回下一个函数来按顺序处理您的承诺。

而不是



func1().then(function(result) {
  func2(result).then(function(result2) {
    func3(result, result2).then(function(finalResult) {
      console.log(finalResult);
    }, function(err) {
      console.log(err);
    });
  });
}).catch(function(err) {
  console.log(err);
});




试试这个:



func1()
  .then(result => func2(result))
  .then(result => func3(result))
  .then(result => console.log('Final result', result))
  .catch(err => console.error(err))




我将您的功能转换为箭头功能以进行更多清理,但功能上它与您的功能相同。