我在Chrome中使用ES6 javascript承诺,并且无法理解为什么在函数_getStatus()中执行的承诺未返回结果参数成功处理程序将导致警报框包含"完成"。相反,我得到一个警告框,上面写着" undefined"。
myNameSpace = function(){
var obj = {
groupA: {
status: "inactive"
},
groupB: {
status: "active"
}
};
function _getStatus(group){
_finishTask().then(function(result){
return result; // doesn't return anything
});
}
function _finishTask(){
var promise = new Promise(function(resolve, reject){
// do some task before resolving
resolve("done");
});
return promise;
};
return{
getStatus:_getStatus
}
}();
$(function(){
alert(myNameSpace.getStatus("groupA")); // why is this "undefined" instead of "done"?
});
答案 0 :(得分:2)
因为这不是Promises的工作方式。您需要确保_getStatus
和_finishTask
都返回Promise对象。然后,您将能够使用这些promises API方法来执行后续代码,以解决承诺。
所以你的代码应该是这样的:
myNameSpace = function() {
var obj = {
groupA: {
status: "inactive"
},
groupB: {
status: "active"
}
};
function _getStatus(group) {
return _finishTask().then(function(result) {
return result + " and tested";
});
}
function _finishTask() {
return new Promise(function(resolve, reject) {
// do some task before resolving
resolve("done");
});
};
return {
getStatus: _getStatus
}
}();
myNameSpace.getStatus("groupA").then(alert);
最后,关于这种结构:
return _finishTask().then(function(result) {
return result;
});
_finishTask
返回一个Promise对象,当这个promise得到解决后,你会进入then
回调。无论您从此回调中返回什么值,都会成为解决方案链中后续成功回调的新分辨率值。
答案 1 :(得分:1)
您无法从异步函数返回结果,因为运行它的代码在返回响应时已经完成。
但是,您可以在代码完成后传入回调函数执行:
function _getStatus(group, callback){
_finishTask().then(function(result){
callback(result);
});
}
$(function(){
myNameSpace.getStatus("groupA", function(result) {
alert(result);
});
});
或使用promise api本身(在这种情况下,你的_getStatus方法有点多余):
function _getStatus(group){
return _finishTask();
}
$(function(){
myNameSpace.getStatus("groupA").then(function(result) {
alert(result);
});
});