如何正确编写 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'当前线程。
三个注意事项:
- 只要你已经有一个承诺(在本例中,来自
RulesService.getLeagueByID
),你就不需要使用 new Promise
。 Insetad,把你已经拥有的承诺联系起来。 (More here.)
- 不要吞下错误;要么允许它们传播给调用者,以便调用者知道发生了什么,要么报告它们(不仅仅是向控制台)。只在最高级别处理错误,这通常是启动整个过程的事件处理程序。
- 您不会从函数返回任何东西。
解决这些问题,您的函数可能应该如下所示,它允许调用者处理错误:
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});
嗨,我正在尝试将这个函数写成一个承诺,我知道如何在 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'当前线程。
三个注意事项:
- 只要你已经有一个承诺(在本例中,来自
RulesService.getLeagueByID
),你就不需要使用new Promise
。 Insetad,把你已经拥有的承诺联系起来。 (More here.) - 不要吞下错误;要么允许它们传播给调用者,以便调用者知道发生了什么,要么报告它们(不仅仅是向控制台)。只在最高级别处理错误,这通常是启动整个过程的事件处理程序。
- 您不会从函数返回任何东西。
解决这些问题,您的函数可能应该如下所示,它允许调用者处理错误:
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});