Working with promises inside an if/else

后端 未结 10 887
北恋
北恋 2021-02-02 10:46

I have a conditional statement in which I need to perform one of two operations, then continue after whichever operation has resolved. So my code currently looks as follows:

相关标签:
10条回答
  • 2021-02-02 11:38

    You can use async/await

    async function fn() {
      let p, result;
      if (shoud_do_thing_a) {
        p = await do_thing_a()
      } else {
        p = await do_thing_b()
      }
      if (p) {
        result = more_code();
      }
      return result
    }
    
    0 讨论(0)
  • 2021-02-02 11:40

    Similar to other answers here, but you can self execute the async and clean up the condition a bit.

    (async () => {
      const should_do_thing_a = true
    
      const do_thing_a = function() {
        return new Promise(function(resolve, reject) {
          resolve('a')
        })
      }
    
      const do_thing_b = function() {
        return new Promise(function(resolve, reject) {
          resolve('b')
        })
      }
    
      const result = (should_do_thing_a) ? await do_thing_a() : await do_thing_b()
    
      console.log(result)
    
    })()

    0 讨论(0)
  • 2021-02-02 11:41

    If you're stuck with raw Promises and can't use async/await (You usually should have no trouble, what with babel/typescript etc), the following is a bit more elegant than storing the promise in a variable:

    function something() {
      return Promise.resolve()
        .then(() => {
          if (should_do_thing_a) {
            return do_thing_a();
          }
          else if (should_do_thing_b) {
            return do_thing_b();
          }
        })
        .then(some_more_code);
    }
    

    Note that when you start working with Promises, your functions should always return a Promise that other functions can work with. Leaving an asynchronous action without any way to handle it means bad things, especially when it comes to error handling.

    In a more general sense, it means that when you use Promises, more of your code is "uplifted" into being executed and returned as Promises.

    0 讨论(0)
  • 2021-02-02 11:44

    The way I would do it would be to put the if check into another function that returns a promise. The promise gets resolved with the resolve of the other function calls in the if-else statement.

    Example:

    function performCheck(condition) {
        var defer = $q.defer();
        if (condition) {
            doThingA().then(function(response) {
                defer.resolve(response);
            });
        } else {
            doThingB().then(function(response) {
                defer.resolve(response)
            });
        }
        return defer.promise;
    }
    performCheck(condition).then(function(response) {
        //Do more code.
    });
    

    In my opinion, I would prefer this method because this function can now be used in multiple places where you have a check on the condition, reducing code duplication, and it is easier to follow.

    You could reduce this down further with

    function performCheck(condition) {
        var defer = $q.defer();
        var doThisThing = condition ? doThingA : doThingB;
        doThisThing().then(function (response) {
            defer.resolve(response);
        });
        return defer.promise;
    }
    performCheck(condition).then(function(response) {
        //Do more code.
    });
    
    0 讨论(0)
提交回复
热议问题