如何正确编写 es5 Promise JavaScript AngularJs

How to properly write es5 Promise JavaScript AngularJs

嗨,我正在尝试将这个函数写成一个承诺,我知道如何在 es6 中编写异步函数,但在 es5 中我很挣扎 这是我试过的:

function getLeagueByID(sportID) {
      console.log(sportID);
      new Promise(function (resolve, reject) {
        RulesService.getLeagueByID(sportID)
          .then(function (results) {
            $scope.leagueById = results.data;
            getStatistics($scope.leagueById[0]);
          })
          .catch(function (err) {
            console.log(err);
          });
      });
    }

后面这个函数应该怎么调用?

function getLeagueByID(sportID) {
      console.log(sportID);
      return new Promise(function (res, rej) { //you need to return here
        RulesService.getLeagueByID(sportID)
          .then(function (results) {
            $scope.leagueById = results.data;
            res(getStatistics($scope.leagueById[0])); //resolve 
            return; //return to avoid unintended side effects
          })
          .catch(function (err) {
            console.log(err);
            rej(err) //need to reject
            return; //return to avoid unintended side effects
          });
      });
    }

Promise 就像一个异步方法。 要使用它,您可以

await getLeagueByID(sportID)

异步方法中,或者您可以使用

getLeagueByID(sportID).then(r=>console.log(r)).catch(e=>console.log(e)) 

本质上是'forking'当前线程。

三个注意事项:

  1. 只要你已经有一个承诺(在本例中,来自 RulesService.getLeagueByID),你就不需要使用 new Promise。 Insetad,把你已经拥有的承诺联系起来。 (More here.)
  2. 不要吞下错误;要么允许它们传播给调用者,以便调用者知道发生了什么,要么报告它们(不仅仅是向控制台)。只在最高级别处理错误,这通常是启动整个过程的事件处理程序。
  3. 您不会从函数返回任何东西。

解决这些问题,您的函数可能应该如下所示,它允许调用者处理错误:

function getLeagueByID(sportID) {
    console.log(sportID);
    return RulesService.getLeagueByID(sportID)
        .then(function(results) {
            $scope.leagueById = results.data;
            getStatistics($scope.leagueById[0]); // If this returns a promise or
                                                 // value you should return, add
                                                 // `return` in front of it
        });
    });
}

但是如果你不希望调用者处理错误,那么:

function getLeagueByID(sportID) {
    console.log(sportID);
    return RulesService.getLeagueByID(sportID)
        .then(function(results) {
            $scope.leagueById = results.data;
            getStatistics($scope.leagueById[0]); // If this returns a promise or
                                                 // value you should return, add
                                                 // `return` in front of it
        })
        .catch(function (err) {
            // Do something other than just `console.log` here, in most cases; for instance, show an
            // error to the user
        });
    });
}

And how should I call this function latter?

这取决于调用函数的内容。与上面一样,如果它是期望 its 调用者处理错误的东西,那么:

return getLeagueByID(someSportId);

如果它是事件处理程序或类似的,因此不希望其调用者处理错误,则:

getLeagueByID(someSportId)
    .catch(function (err) {
        // Do something other than just `console.log` here, in most cases; for instance, show an
        // error to the user
    });

作为RulesService.getLeagueByIDreturn的承诺,您可以return那个。

function getLeagueByID(sportID) {
  console.log(sportID);
  return RulesService.getLeagueByID(sportID)
     .then(function (results) {
        $scope.leagueById = results.data;
        getStatistics($scope.leagueById[0]);
     })
     .catch(function (err) {
        console.log(err);
     });
}

调用它

getLeagueByID(id)
   .then(function(){HANDLER CODE});