承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)

Posted

技术标签:

【中文标题】承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)【英文标题】:Promise either never get called, or is rejected (Parse JS SDK) 【发布时间】:2016-07-20 18:20:13 【问题描述】:

我正在尝试编写一个在用户对象上添加或编辑某些字段的函数。

当我尝试保存用户时,问题来了,如果我使用user.save,Promise 被拒绝,错误为 206 UserCannotBeAlteredWithoutSessionError

但是,如果我获得了会话 ID(并且有关它的文档很少),则承诺永远不会得到解决,也不会被拒绝。该应用似乎只是跳转到回调。

我的功能:

function update(user, callback) 
    let query = new Parse.Query(Parse.User);

    query.equalTo("username", user.email);
    query.find().then(
        (users) => 
            if(users.length === 0) 
                callback('Non existent user');
             else 
                let user = users[0];

                // user.set('some', 'thing');
                console.log('save');
                user.save(/*
                    sessionToken: user.getSessionToken()
                */).then(
                    (test) => 
                        console.log('OK - ' + test);
                        callback();
                    , (err) => 
                        console.log('ERR- ' + require('util').inspect(err));
                        // console.log(callback.toString());
                        callback(error.message);
                    
                );
            
        ,
        (error) => 
            callback(error.message);
        
    );

调用:

var async = require('async'),
    baas = require('./baas.js');

async.waterfall([
    (callback) => 
        callback(null, 
            email: 'user@test.com',
            password: 'password'
        );
    ,
    (user, callback) => 
        console.log('connect');
        baas.connect(() =>  //Initialize the connection to Parse, and declare use of masterKey
            callback(null, user);
        );
    ,
    (user, callback) => 
        console.log('update');
        baas.update(user, (err) => 
            callback(err);
        );
    
], (err) => 
    console.log('Error: ' + err);
);

日志变成: 没有会话令牌:

connect
update
save
ERR- ParseError  code: 206, message: 'cannot modify user sA20iPbC1i' 

使用会话令牌:

connect
update
save

我不明白承诺怎么可能只是回调而不打印任何内容,也不明白为什么在任何地方都没有引发错误。

编辑:

按照@user866762 的建议,我尝试将查询替换为Parse.User.logIn,并使用生成的User 对象。

虽然这个解决方案给了我一个sessionToken,但最终结果是一样的,如果我不提供会话令牌,则解析崩溃,如果我提供,则给我一个错误。

【问题讨论】:

如果你在console.log(user.getSessionToken()) 之前console.log('save') 会发生什么? @user866762:早该想到的,打印undefined 【参考方案1】:

根据Parse Dev guide:

...您无法调用任何savedelete 方法,除非Parse.User 是使用经过身份验证的方法获得的,例如logInsignUp

您也可以在保存之前尝试becoming 用户,但我怀疑这是否可行。

当您“获取 [ting] 会话 ID”时,我的猜测是您确实在破坏某些东西。要么 Parse 在你请求会话令牌时心脏病发作,要么当你在 save 中传递它时,你正在导致那里发生爆炸。

【讨论】:

成为用户是个坏主意,在这个功能中保持密码能够logIn不是我喜欢的,但我会尝试的。 尝试后,我得到与不提供用户令牌时相同的错误。但是,我可以获得sessionToken,但是我们回到与以前相同的错误,解析崩溃并且不调用promise。

以上是关于承诺要么永远不会被调用,要么被拒绝(Parse JS SDK)的主要内容,如果未能解决你的问题,请参考以下文章

异常被承诺链吞噬

返回承诺的 Vuex 操作永远不会解析或拒绝

解析:[PFFacebookUtils reauthorizeUser:] 回调永远不会被调用

Parse ParseFacebookUtilsV4 登录问题

深入理解计算机系统 第八章 异常控制流(2)

再回首Java第六天