Javascript решает не делать то, что ожидается - PullRequest
0 голосов
/ 02 июня 2018

В моем Обещании у меня есть следующий код:

if(a === b){
    resolve();
}

Я ожидаю, что когда a === b, Promise.then () выполняется, когда я вызываю resolve (), когда выполняется это условие.Но этого не происходит, и код сразу после того, как этот фрагмент кода успешно выполняется.

Ожидаю ли я неправильного поведения? Java

Редактировать: Неполный код:

return new Promise(function (resolve, reject) {
var itemCounter = 0;
var noContentCounter = 0;
for(var index=0;index<itemList.length;index++) {
        const item = itemList[index];
        client.get(urls[env] + item['itemId'], function (data, response) {
            itemCounter = itemCounter + 1;
            try {
                if (response.statusCode === 204) {
                    noContentCounter = noContentCounter + 1;
                    if(noContentCounter === itemList.length){
                        resolve();
                    }else {
                        return;
                    }
                }
                ...

Итак, если для какого-либо элемента в списке не было найдено содержимого, я бы хотел, чтобы Promise.then вызывался (для обработки следующего списка), а не выполнял следующий код.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Когда вы вызываете resolve, обещание действительно разрешено, но обратные вызовы then, которые могут у вас возникнуть для этого обещания, будут выполнены только после того, как текущий стек вызовов завершится.Другими словами, обратные вызовы then выполняются асинхронно, даже если разрешение происходило синхронно.

Таким образом, любой код, следующий за resolve(), действительно «сначала успешно выполнится».Если вы не хотите, чтобы это произошло, поставьте return сразу после этого звонка.Некоторые даже пишут это в одну строку

return resolve();

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

0 голосов
/ 02 июня 2018

https://promisesaplus.com/

Здесь «код платформы» означает код реализации, среды и обещания.На практике это требование гарантирует, что onFulfilled и onRejected выполняются асинхронно после поворота цикла событий, в котором затем вызывается, и со свежим стеком.Это может быть реализовано с помощью механизма «макро-задачи», такого как setTimeout или setImmediate, или с помощью механизма «микро-задачи», такого как MutationObserver или process.nextTick

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Return_value

Обещание в состоянии ожидания.Затем функция-обработчик (onFulfilled или onRejected) вызывается асинхронно (как только стек пуст)

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