Javascript 解析承诺返回空对象
我正在迭代一个数组,但每次迭代都会调用一个异步方法 这是代码Javascript 解析承诺返回空对象,javascript,jquery,parse-platform,promise,Javascript,Jquery,Parse Platform,Promise,我正在迭代一个数组,但每次迭代都会调用一个异步方法 这是代码 var getTaskResponse = function(displayedWidgetId) { var promises = []; // var promise = new Parse.Promise(); jQuery.ajax({ type: "POST", url: 'https://api.parse.com/1/functions/getWidgetResp
var getTaskResponse = function(displayedWidgetId) {
var promises = [];
// var promise = new Parse.Promise();
jQuery.ajax({
type: "POST",
url: 'https://api.parse.com/1/functions/getWidgetResponse',
data: {
"groupWidgetId": displayedWidgetId
},
beforeSend: function(request) {
request.setRequestHeader("X-Parse-Application-Id", parse_ids.app_id);
request.setRequestHeader("X-Parse-REST-API-Key", parse_ids.rest_api);
}
})
.then(function(response){
var promise = new Parse.Promise();
var taskIssuedTo = {},
taskObj = {},
finalObj = {},
subTasks = [],
taskResponse = response.result;
taskResponse.forEach(function(widgetResponseObj,index) {
var issuedTo = widgetResponseObj.answeredBy.objectId,
taskResponseObj = JSON.parse(widgetResponseObj.widgetResponse),
taskSelected = taskResponseObj.taskSelected,
date = taskResponseObj.date;
(function(userId){
getUsersName(userId).then(function(userName){
if (typeof taskIssuedTo[taskSelected] === "undefined") {
taskIssuedTo[taskSelected] = [];
subTasks = [];
}
subTasks.push({
"user" : userName.result.name,
"date" : date
});
taskIssuedTo[taskSelected] = subTasks;
taskObj[taskSelected] = taskIssuedTo[taskSelected];
});
}(issuedTo));
});
promise.resolve(taskObj);
return promise;
})
.then(function(obj){
console.log("After Promise Return :: "+JSON.stringify(obj));
});
}
在上面的中,对于每个循环
getUsersName是被调用的方法。当我打印下决心的承诺时,这就是我得到的
承诺返回后::{“{u resolved”:true,“{u rejected”:false,“{u resolvedCallbacks”:[],“{u rejectedCallbacks”:[],“{u result”:{“0”:{}}}}
我应该如何解决承诺以获得所需的输出?问题是在
taskResponse.forEach
中调用的是异步的getUserName
。您知道,当它完成时,将发生更多的工作,但您的外部功能并不是等待完成
以下是应采取的方法:
var getTaskResponse = function (displayedWidgetId) {
var promiseToReturn = new Parse.Promise();
// var promise = new Parse.Promise();
jQuery.ajax({
type: "POST",
url: 'https://api.parse.com/1/functions/getWidgetResponse',
data: {
"groupWidgetId": displayedWidgetId
},
beforeSend: function (request) {
request.setRequestHeader("X-Parse-Application-Id", parse_ids.app_id);
request.setRequestHeader("X-Parse-REST-API-Key", parse_ids.rest_api);
}
}).then(function (response) {
var taskIssuedTo = {},
taskObj = {},
finalObj = {},
subTasks = [],
taskResponse = response.result;
var promisesToWaitOn = [];
taskResponse.forEach(function (widgetResponseObj, index) {
var issuedTo = widgetResponseObj.answeredBy.objectId,
taskResponseObj = JSON.parse(widgetResponseObj.widgetResponse),
taskSelected = taskResponseObj.taskSelected,
date = taskResponseObj.date;
promisesToWaitOn.push(function (userId) {
return getUsersName(userId).then(function (userName) {
if (typeof taskIssuedTo[taskSelected] === "undefined") {
taskIssuedTo[taskSelected] = [];
subTasks = [];
}
subTasks.push({
"user": userName.result.name,
"date": date
});
taskIssuedTo[taskSelected] = subTasks;
taskObj[taskSelected] = taskIssuedTo[taskSelected];
});
}(issuedTo));
});
return Parse.Promise.when(promisesToWaitOn).then(function () {
promiseToReturn.resolve(taskObj);
});
});
return promiseToReturn;
}
如果要访问函数的结果,请执行以下操作:
getTaskResponse(widgitId).then(function(taskObj) {
// Here is where you can do something with the generated taskObj
});
问题是在
taskResponse.forEach
中调用的是异步的getUserName
。您知道,当它完成时,将发生更多的工作,但您的外部功能并不是等待完成
以下是应采取的方法:
var getTaskResponse = function (displayedWidgetId) {
var promiseToReturn = new Parse.Promise();
// var promise = new Parse.Promise();
jQuery.ajax({
type: "POST",
url: 'https://api.parse.com/1/functions/getWidgetResponse',
data: {
"groupWidgetId": displayedWidgetId
},
beforeSend: function (request) {
request.setRequestHeader("X-Parse-Application-Id", parse_ids.app_id);
request.setRequestHeader("X-Parse-REST-API-Key", parse_ids.rest_api);
}
}).then(function (response) {
var taskIssuedTo = {},
taskObj = {},
finalObj = {},
subTasks = [],
taskResponse = response.result;
var promisesToWaitOn = [];
taskResponse.forEach(function (widgetResponseObj, index) {
var issuedTo = widgetResponseObj.answeredBy.objectId,
taskResponseObj = JSON.parse(widgetResponseObj.widgetResponse),
taskSelected = taskResponseObj.taskSelected,
date = taskResponseObj.date;
promisesToWaitOn.push(function (userId) {
return getUsersName(userId).then(function (userName) {
if (typeof taskIssuedTo[taskSelected] === "undefined") {
taskIssuedTo[taskSelected] = [];
subTasks = [];
}
subTasks.push({
"user": userName.result.name,
"date": date
});
taskIssuedTo[taskSelected] = subTasks;
taskObj[taskSelected] = taskIssuedTo[taskSelected];
});
}(issuedTo));
});
return Parse.Promise.when(promisesToWaitOn).then(function () {
promiseToReturn.resolve(taskObj);
});
});
return promiseToReturn;
}
如果要访问函数的结果,请执行以下操作:
getTaskResponse(widgitId).then(function(taskObj) {
// Here is where you can do something with the generated taskObj
});
您的代码不工作,抛出一个错误,说“resolvedCallback不是一个函数”。实际上,我正在从另一个函数调用上面的getTaskResponse(),我想从那里访问已解析的承诺。我如何才能做到这一点?@Tushar2098-我在答案中添加了另一个代码片段来帮助您。@Tushar2098-这是因为
getTaskResponse
没有返回任何内容。你想让它回报你的承诺。我再次修改了代码。构建taskObj
的函数看起来应该简化很多。您的代码不工作,抛出一个错误,说“resolvedCallback不是函数”。实际上,我正在从另一个函数调用上面的getTaskResponse(),我想从那里访问已解析的承诺。我如何才能做到这一点?@Tushar2098-我在答案中添加了另一个代码片段来帮助您。@Tushar2098-这是因为getTaskResponse
没有返回任何内容。你想让它回报你的承诺。我再次修改了代码。构建taskObj
的函数看起来应该简化很多。您的代码不工作,抛出一个错误,说“resolvedCallback不是函数”。实际上,我正在从另一个函数调用上面的getTaskResponse(),我想从那里访问已解析的承诺。我如何才能做到这一点?@Tushar2098-我在答案中添加了另一个代码片段来帮助您。@Tushar2098-这是因为getTaskResponse
没有返回任何内容。你想让它回报你的承诺。我再次修改了代码。构建taskObj
的函数看起来应该简化很多。@Bergi-它与@Andrew声明的promisesToWaitOn相同(jst变量名已更改)。它被用来存储我从每个循环中得到的承诺。这是我认为应该的,但实际上你没有使用它。@Bergi-它与@Andrew声明的promisesToWaitOn相同(jst变量名被更改)。它被用来存储我从每个循环中得到的承诺。这是我认为应该的,但实际上你没有使用它。@Bergi-它与@Andrew声明的promisesToWaitOn相同(jst变量名被更改)。它用于存储我从每个循环中得到的承诺。这是我认为它应该是的,但实际上你没有使用它。