Этот код возвращает вышеуказанную ошибку при нажатии.

Html:

<button id="_btn">click</button>

Js:

var btn = document.getElementById("_btn");

function rej(params) {
}
function res(params) {
}

let func = new Promise(function (res, rej) {
});

btn.addEventListener("click", func);

Что я делаю неправильно?

-2
yossi 20 Апр 2020 в 08:06

2 ответа

Что я делаю неправильно?

Во-первых, этот код:

let func = new Promise(function (res, rej) {
});

Создает обещание, которое никогда не будет разрешено или отклонено. Нужно иметь код внутри этой функции обратного вызова, который выполняет что-то асинхронное, и затем, когда эта асинхронная операция завершается, он вызывает одну из двух функций, переданных этому обратному вызову res(value) или rej(reason). Здесь два аргумента для этой функции обратного вызова: function (res, rej) { - это функции, которые обещание создало и передало обратному вызову. Твоя работа как создателя обещания - позвонить одному из них в будущем. Обещание, в котором нет кода, который когда-либо вызывает один из них, бесполезно. Это просто объект, который никогда ничего не делает.

Во-вторых, этот код также назначает это вновь созданное обещание переменной с именем func. Это означает, что вы думаете, что это функция. Это не. Это объект, точнее объект обещания. Вы не можете вызывать этот объект, как функцию.

В-третьих, вы берете это обещание и передаете его здесь как функцию обратного вызова:

btn.addEventListener("click", func);

addEventListener() нужен, чтобы второй аргумент был функцией. Вы дали обещание, которое не является функцией. Это ошибка вызова.


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


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

0
jfriend00 20 Апр 2020 в 08:47

Всякий раз, когда вы используете оператор new, вы возвращаете нефункциональный объект. Обещание не является функцией.

let func = function(e){
    return new Promise(function (res, rej) {
        return ...
    }); };

Кроме того, вам не нужно определять функции res и res, они встроены в Promise. Прочитайте API Promise!

-1
JGof 20 Апр 2020 в 05:19