Применение обещания для getCookies

Я пытаюсь применить обещание для получения файлов cookie из браузера.

browserCookies = {
    art_rfp : '',
    art_token : ''
};


var promise = new Promise((resolve, reject) => {
    chrome.cookies.getAll({"url":"https://url.com"}, function (cookies) {
        for(var i=0; i<cookies.length; i++){
            var name = cookies[i].name
            // console.log(name)
            if (name == 'sso_rfp') {
                console.log(name) // line 13
                browserCookies.art_rfp = cookies[i].value
                resolve('cookies found')
            }
            else if (name == 'sso_token') {
                console.log(name) // line 18
                browserCookies.art_token = cookies[i].value
            }
            else {
                reject('no cookies found')
            }
        }
    });

})

promise.then((message) => {
    console.log(message)
}).catch((message) =>{
    console.log(message)
})

Однако это просто терпит неудачу.

background.js:13 sso_rfp
background.js:18 amzn_sso_token
background.js:32 no cookies found

почему не решает?

Обещания не ждут волшебным образом, пока что-то завершится — невозможно узнать, как это сделать, не решив проблему остановки. Вы можете вернуть обещание изнутри getCookies() и разрешить его в обратном вызове getAll().

Etheryte 22.05.2019 15:02

хорошо, это то, что я пытался, но не мог заставить его работать. Я обновил свой код и вставил то, что печатает. Любая идея, почему это не разрешается?

Morgan Allen 22.05.2019 15:04

В вашем обновлении обещания используются правильно в техническом смысле (не уверен, что с точки зрения бизнес-логики), но у вас есть затененная переменная. Объект, которому вы пытаетесь присвоить значения, называется cookies, но параметр обратного вызова также называется cookies — вы думаете, что присваиваете значения внешнему объекту, но на самом деле обращаетесь к параметру обратного вызова.

Etheryte 22.05.2019 15:08

ааа... шиииииии хорошо. позвольте мне попробовать это

Morgan Allen 22.05.2019 15:09

обновил, все еще не решает

Morgan Allen 22.05.2019 15:11

Есть ли шанс, что вы можете поместить это в jsfiddle, чтобы мы могли работать непосредственно с кодом?

Todd Chaffee 22.05.2019 15:11

так? - jsfiddle.net/4zu6Lr7f/1

Morgan Allen 22.05.2019 15:12

Обещание может быть разрешено/отклонено только один раз! Вы используете цикл, который потенциально может разрешать или отклонять на каждой итерации, что не имеет смысла. Поэтому, когда он попадает в первый отказ, вот и все, ваши решения не будут разрешены.

Keith 22.05.2019 15:13

хорошо, я думаю, что понял. Мне нужно дождаться 1.) завершения выборки 2.) завершения цикла for, а затем проверить, обновлены ли его файлы cookie и выполнено ли обещание?

Morgan Allen 22.05.2019 15:17

@MorganAllen Да, это в значительной степени идея, я придумал ответ с тем, что, как я думаю, вы хотите ..

Keith 22.05.2019 15:33
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
10
229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обещания могут быть отклонены/решены только один раз.

Итак, что, вероятно, происходит внутри вашего цикла, имя первого файла cookie не является ни sso_rfp, ни sso_token, поэтому он вызовет reject('no cookies found'), поэтому, даже если позже будут найдены другие, они не могут быть разрешены, потому что отклонение уже было вызвано.

Итак, что вы хотите сделать, это отслеживать с помощью простого логического значения, где файл cookie был найден или не найден, а затем разрешать/отклонять в конце.

например..

var promise = new Promise((resolve, reject) => {
    chrome.cookies.getAll({"url":"https://url.com"}, function (cookies) {
        var found = false;
        for(var i=0; i<cookies.length; i++){
            var name = cookies[i].name
            // console.log(name)
            if (name == 'sso_rfp') {
                console.log(name) // line 13
                browserCookies.art_rfp = cookies[i].value
                found = true;
            }
            else if (name == 'sso_token') {
                console.log(name) // line 18
                browserCookies.art_token = cookies[i].value;
                found = true;
            }
        }
        if (found) resolve("Cookies Found");
        else reject("no cookies found");
    });
})

Кроме того, это просто стандарт кодирования, лично я бы избегал использования глобального browserCookies и вместо этого использовал эти значения.

Другие вопросы по теме