Javascript 承诺不会延迟函数执行
Javascript promise not delaying function execution
我在 Chrome 中使用 ES6 javascript promises 并且无法理解为什么在 function _getStatus() 中执行的 promise 没有返回成功处理程序中的 result 参数将导致包含 "done" 的警告框。相反,我收到一个警告框,上面写着 "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"?
});
因为这不是 Promises 的工作方式。您需要确保 _getStatus
和 _finishTask
return Promise 对象。然后你就可以使用那些 promises API 方法来执行 promise 被解决的后续代码。
因此您的代码应如下所示:
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
return 是一个 Promise 对象,当这个 promise 被解析时,你会进入 then
回调。无论您从该回调中 return 得到什么值,都会成为后续成功回调在解析链中的新解析值。
您不能 return 异步函数的结果,因为代码 运行 在响应 returned 时它已经完成。
然而,您可以传入回调以在代码完成后执行:
function _getStatus(group, callback){
_finishTask().then(function(result){
callback(result);
});
}
$(function(){
myNameSpace.getStatus("groupA", function(result) {
alert(result);
});
});
或使用承诺 api 本身(在这种情况下,您的 _getStatus 方法有点多余):
function _getStatus(group){
return _finishTask();
}
$(function(){
myNameSpace.getStatus("groupA").then(function(result) {
alert(result);
});
});
我在 Chrome 中使用 ES6 javascript promises 并且无法理解为什么在 function _getStatus() 中执行的 promise 没有返回成功处理程序中的 result 参数将导致包含 "done" 的警告框。相反,我收到一个警告框,上面写着 "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"?
});
因为这不是 Promises 的工作方式。您需要确保 _getStatus
和 _finishTask
return Promise 对象。然后你就可以使用那些 promises API 方法来执行 promise 被解决的后续代码。
因此您的代码应如下所示:
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
return 是一个 Promise 对象,当这个 promise 被解析时,你会进入 then
回调。无论您从该回调中 return 得到什么值,都会成为后续成功回调在解析链中的新解析值。
您不能 return 异步函数的结果,因为代码 运行 在响应 returned 时它已经完成。
然而,您可以传入回调以在代码完成后执行:
function _getStatus(group, callback){
_finishTask().then(function(result){
callback(result);
});
}
$(function(){
myNameSpace.getStatus("groupA", function(result) {
alert(result);
});
});
或使用承诺 api 本身(在这种情况下,您的 _getStatus 方法有点多余):
function _getStatus(group){
return _finishTask();
}
$(function(){
myNameSpace.getStatus("groupA").then(function(result) {
alert(result);
});
});