Javascript -Uncaught承诺被拒绝,即使它已被拒绝

时间:2014-10-31 15:14:25

标签: javascript parse-platform promise

我正在运行这个Parse.com云代码作业。它查询我的一个类并获取URL,然后我读取这些URL,它们是xml文件,我从中获取一些数据并将其保存到解析中。从代码中可以看出。

这是代码

这里的完整代码gist.github.com/gouegd/aae61aa08b8295d52b08

当我运行此云代码作业时。在控制台中。我看到了这条消息

Failed with: Uncaught A promise was rejected even though it had already been rejected.

这是因为某些网址无效,然后代码中断了。

基本上我需要一种方法来处理它,当其中一个URL没有工作,没有代码停止!并继续其他网址。

这个问题出现在第77-83行之间,其中传递了url变量,所以我需要它来忽略坏网址,然后继续使用其他网址。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是一个奇怪的错误消息。

据我所知......

在89行和90行之间插入:

    }, function() {
        return Parse.Promise.as();//return resolved promise to keep the promise chain going.

给予:

return Parse.Cloud.httpRequest({
    url: url,
    //data: ... //some properties of menuItem?
}).then(function(httpResponse) {
    return readResponse_async(httpResponse.text).then(function(res) {
        if (res.menu.day.at(dayNumber).meal) {

            return saveMeals_async(res.menu.day.at(dayNumber).meal, school, diningHallNumber, menuLocation);
        } else {
            return Parse.Promise.as();//return resolved promise to keep the promise chain going.
        }
    }, function() {
        return Parse.Promise.as();//return resolved promise to keep the promise chain going.
    });
});

或者可能更低一行:

return Parse.Cloud.httpRequest({
    url: url,
    //data: ... //some properties of menuItem?
}).then(function(httpResponse) {
    return readResponse_async(httpResponse.text).then(function(res) {
        if (res.menu.day.at(dayNumber).meal) {

            return saveMeals_async(res.menu.day.at(dayNumber).meal, school, diningHallNumber, menuLocation);
        } else {
            return Parse.Promise.as();//return resolved promise to keep the promise chain going.
        }
    });
}, function() {
    return Parse.Promise.as();//return resolved promise to keep the promise chain going.
});

修改

由于这两个都未能处理错误,你可能会尝试这个,如果我怀疑,Parse的承诺不是“扔掉安全的”,那么这很麻烦但是可以忍受:

return Parse.Cloud.httpRequest({
    url: url,
    //data: ... //some properties of menuItem?
}).then(function(httpResponse) {
    try {
        return readResponse_async(httpResponse.text).then(function(res) {
            if (res.menu.day.at(dayNumber).meal) {
                return saveMeals_async(res.menu.day.at(dayNumber).meal, school, diningHallNumber, menuLocation);
            } else {
                throw new Error();
            }
        });
    }
    catch(e) {
        return Parse.Promise.as();//return resolved promise to keep the promise chain going.
    }
}, function() {
    return Parse.Promise.as();//return resolved promise to keep the promise chain going.
});