【问题标题】:Parse promise returns empty object解析承诺返回空对象
【发布时间】:2015-06-13 18:42:14
【问题描述】:

我正在迭代一个数组,但每次迭代时,我都在调用一个异步方法。

这是代码

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));
    });
}

在上面的for-each loop getUsersName 是被调用的方法。当我打印已解决的承诺时,这就是我得到的

承诺返回后::{"_resolved":true,"_rejected":false,"_resolvedCallbacks":[],"_rejectedCallbacks":[],"_result":{"0":{}}}.

我应该如何解决承诺,以便获得所需的输出?

【问题讨论】:

  • @Bergi- 与 @Andrew(jst variable name got changed) 声明的 promisesToWaitOn 相同。它用于存储我从 for-each 循环中获得的 Promise。
  • 我认为应该是这样,但后来你并没有真正使用它。

标签: javascript jquery parse-platform promise


【解决方案1】:

问题在于,在 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 is not a function”
  • 实际上,我正在从另一个函数调用上面的 getTaskResponse() ,然后我想从那里访问已解决的承诺。我怎样才能做到这一点?
  • @Tushar2098 - 我在答案中添加了另一个代码 sn-p 以帮助您。
  • @Tushar2098 - 那是因为getTaskResponse 没有返回任何东西。你希望它返回一个承诺。我又修改了代码。
  • 构建taskObj的函数看起来应该相当简化了。
猜你喜欢
  • 2020-03-03
  • 2014-10-05
  • 1970-01-01
  • 2020-01-04
  • 2017-05-18
  • 2017-07-18
  • 2018-06-10
  • 2023-03-11
  • 2018-08-24
相关资源
最近更新 更多