Как Promises работают в этом коде? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть пара вопросов по поводу кода ниже:

  • getRemoteProfile возвращает Promise.resolve только для одного условия, но getRemoteProfile вызовы всегда связаны с then, так что происходит, когдачто условие не выполняется?
  • В чем разница между return promise и return promise.resolve, я думаю, return promise.resolve всегда попадает в

    function getRemoteProfile(id) {
        if (!id && /^_/.test(id)) {
            return Promise.resolve(null);
        }
        var isGroup = app.isGroupId(id);
        if (isGroup) {
            return getGroupInfo(id);
        } else {
            return getUserInfo(id.split('@')[0], app.currentUserDomain);
        }
    }
    
    function reloadProfile(id, keep) {
        return getRemoteProfile(id).then(function(contactProfile) {
            // var isGroup = app.isGroupId(id);
            if (contactProfile) {
                contactProfile.contact_id = id;
                if (!keep) {
                    delete profilePromises[id];
                }
                contactProfile.member = true;
                updateProfile(contactProfile.contact_id, contactProfile).then(function() {
                    app.imagesStorage.setContactIcon(contactProfile.contact_id);
                });
    
                return setDetails(contactProfile);
            }
        });
    }
    

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

getRemoteProfile возвращает обещание.resolve только для одного условия, но getRemoteProfile вызывается с последующим, поэтому то, что происходит, когда не попадает в условие

Предположительно getGroupInfo и getUserInfo также возвращает обещания ифункция getRemoteProfile всегда будет идти в одну из этих условных ветвей, которая возвращает значение.Все обещания имеют метод .then, поэтому функция всегда возвращает обещание, которое должно работать.

В чем разница между возвращением обещания и возвращением prommise.resolve, я думаю, что возвращение promise.resolveвсегда в этом случае

Promise.resolve создает обещание, поэтому если вы вернете Promise.resolve(...), то вы are вернете обещание.

0 голосов
/ 23 мая 2018

.then нельзя вызывать для объектов, которые не имеют .then свойств.Таким образом, если getRemoteProfile когда-либо возвращает что-то отличное от Promise, будет (почти всегда) выдано сообщение об ошибке.

Но, в этом случае, если у вас нет причин подозревать, что кодЯ очень подозреваю, что и getGroupInfo, и getUserInfo сами создают и возвращают обещанияgetRemoteProfile не нужно создавать его для них.

Как правило, вы используете Promise.resolve в случае, когда требуется Promise, но текущий случай не требует фактической асинхронной операции (такой каксетевой запрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...