Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析承诺返回空对象_Javascript_Jquery_Parse Platform_Promise - Fatal编程技术网

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变量名被更改)。它用于存储我从每个循环中得到的承诺。这是我认为它应该是的,但实际上你没有使用它。