В соответствии с вышеуказанным кодом:
Всякий раз, когда вы делаете запрос на получение /
, вы СОЗДАЕТЕ /test
путь.
Итак, в первый раз это работает, потому что /test
путь имеет один обработчик.
Второй или более раз это не работает, потому что,
- Маршрут
/test
теперь имеет несколько обработчиков.
- Каковы экспресс-работы, маршруты выполняются в соответствии со временем их объявления. (Вспомним промежуточное ПО)
- Теперь, во второй раз
/test
будет иметь 2 обработчика. И когда вы нажимаете /test
, запускается первый обработчик. И поскольку это не промежуточное программное обеспечение, оно не переходит к следующему обработчику. Теперь первый обработчик имеет другую resolve
функцию, чем второй. Таким образом, вторая функция resolve
вообще не запускается (подумайте о закрытии)
Для того, что вы пытаетесь сделать, в большинстве веб-реализаций используется длинный опрос. Потому что, если вы будете слишком долго ждать второй маршрут, он выдаст ошибку тайм-аута. Означает, что вы периодически нажимаете на API, чтобы получить статус чего-либо. Означает, что вы создаете 3 маршрута.
- Основной маршрут, например
/signup
- Второй маршрут типа
/sendsms
- Третий маршрут, где вы отправляете определенный идентификатор, и он возвращает некоторое положительное / отрицательное значение. как
/sendsms/check
, где вы можете передать номер телефона.
В противном случае, если вам не нужны тайм-ауты, вы можете использовать EventEmitter
внутри маршрута /test
.
EDIT1:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
const events = require('events');
const emitter = new events.EventEmitter();
let count = 0;
app.get('/', async function (req, res) {
console.log(222);
res.send("Hello!!!");
let check;
try {
console.log(3333);
check = await test();
console.log(4444);
}
catch (err) {
console.log("Error : ", err);
}
console.log(111, check);
});
app.get('/test', function (req, res) {
count = count + 1;
emitter.emit("test",count.toString());
res.send(count.toString());
})
function test(){
return new Promise((res)=>{
emitter.on("test", (data)=>{
res(data);
})
})
}
app.listen(9000, function () {
console.log("hehehehe");
});
EDIT2:
Что касается решения, вы должны обрабатывать время ожидания по-разному. Допустим, ваш тайм-аут 3 сек. И для получения ответа по SMS-маршруту потребовалось 100 секунд или, возможно, он даже не получил ответа. Тогда ваша функция застрянет там.
function test(sendSMSTime) {
return new Promise((res, rej) => {
emitter.on("test", (data) => {
.
.
res(data);
})
emitter.on('timeout', rej);//On timeout it will run.
})
}
function timeoutEmitter(timeout) {
setTimeout(() => {
emitter.emit('timeout');
}, timeout)
}
app.post('/signup', async function (req, res) {
try {
timeoutEmitter(3000);
.
.
}catch{
}
});