解析承诺返回空对象 [英] Parse promise returns empty object

查看:70
本文介绍了解析承诺返回空对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm iterating an array, but with each iteration, I'm calling an async method.

这是代码

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 中是被调用的方法.当我打印已解决的承诺时,这就是我所得到的

In above for-each loop getUsersName is the method that is getting called. When i'm printing the resolved promise, this is what i got

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

After Promise Return :: {"_resolved":true,"_rejected":false,"_resolvedCallbacks":[],"_rejectedCallbacks":[],"_result":{"0":{}}}.

我应该如何兑现承诺,以便获得期望的输出?

How should i resolve the promise so that i get desired output?

推荐答案

问题是在taskResponse.forEach内部您正在调用异步的getUserName.您知道当它完成时会进行更多的工作,但是您的外部功能不会等待完成.

The problem is that inside taskResponse.forEach you are invoking getUserName which is asynchronous. You know that when it completes more work will take place, but your outer function is not waiting for the completions to take place.

这是一种采取的方法:

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

如果您想从函数中访问结果,您将像这样进行操作:

If you want to access the results from your function, you would do so like this:

getTaskResponse(widgitId).then(function(taskObj) {
     // Here is where you can do something with the generated taskObj
}); 

这篇关于解析承诺返回空对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆