Вложенные обещания: сделать два вызова обещания, передавая значения - PullRequest
1 голос
/ 07 ноября 2019

В настоящее время я создаю систему лицензий для своих электронных приложений. Но мне не удалось выполнить следующее:

  1. Пообещать пользователю запросить ввод (модуль электронной подсказки)
  2. Выполнить ajax-вызов на сервер сразу после
  3. Оценка ответа (1 \ n или 0 \ n от серверного скрипта)

Головная боль возникает при запуске вызова ajax после получения ввода userinput из приглашения (который структурирован какобещание) и фактически дождитесь его завершения.

До сих пор я пытался реструктурировать свои обещания, как таковые:

(1)

prompt().
  then(ajax()).
    then(evaluate()).
      catch()

(2)

prompt().
  then(ajax().
         then(evaluate())).
    catch()

В данный момент я нахожусь там, где функция ajax не возвращает ничего для передачи.

Первое - это приглашение, которое работает соответственно, возвращая свое значение.

function activeValidation(){
    try{
        prompt({
            title: "Enter key",
            label: "Enter your key",
            value: "",
            alwaysOnTop: true,
            autoHideMenuBar: true,
            inputAttrs: {
                type: 'text'
            },
            type: "input"
        })

Головная боль в этом сегменте, ajax.

        .then(function(userinput){
            return new Promise(function(resolve,userinput){
            var req = new XMLHttpRequest();
            req.onreadystatechange = function(){
                if(req.readyState == 4 && req.status == 200){
                    resolve(req.responseText);          
                }
            }
            req.open("GET","someCGIscript?key="+userinput,true);
            req.send();
            }).then(function(response){
                if(response == "1\n"){
                    runProgram();
                }
                else{
                }
        }).catch(function(e){
            console.error(e);
            terminate();
        })});               
    }
    catch(e){
        console.log(e.name);
        console.log(e.message);
        terminate();
    }
}

Я попытался напечатать значение Promise ajax из resolve(req.responseText);, но в следующем сегменте возвращает неопределенное значение.

После этого я попытался реструктурировать два обещания (nи как потом первое обещание), не повезло.

Я считаю, что это вопрос правильного структурирования обещаний, но я все еще новичок в обещаниях, по крайней мере, в js:).

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

В функции обратного вызова new Promise имеется несоответствие параметров. Второй параметр не имеет ничего общего с userinput, но является отклонением-обратным вызовом, который предоставляется вам (на случай, если вам это нужно). Называя его userinput, вы теряете доступ к фактическому значению userinput, так как оно было передано на одну строку выше него.

Как следствие, HTTP-запрос будет выглядеть примерно так: someCGIscript?key=function () { [native code] }, что, очевидно, приводит кв нежелательном HTTP-ответе.

Так что в списке параметров функции обратного вызова new Promise либо вызовите его reject, либо просто полностью его опустите.

0 голосов
/ 07 ноября 2019

проверьте этот фрагмент. Надеюсь, что это поможет вам. prompt будет обрабатывать пользовательский ввод самостоятельно. поэтому, когда вы получили ввод, выполните вызов ajax и получите ответ сервера. это работает, как вы хотите, и, насколько я понял, ваш вопрос.

    const { app, BrowserWindow } = require('electron')
    const path = require('path')
    const prompt = require('electron-prompt'); // assume that this is what you use 
    var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 

    let mainWindow

    function createWindow() {

    prompt({
        title: 'Prompt example',
        label: 'License Key:',
        value: 'xxxx-xxxx-xxxx-xxxx',
        inputAttrs: {
        type: 'Key'
        },
        type: 'input'
    })
        .then((r) => {
        if (r === null) {
            console.log('user cancelled');
        } else {
            var data = {key: r}; // accepting the user input
            var xhr = new XMLHttpRequest();
            xhr.withCredentials = true; 
            xhr.addEventListener("readystatechange", function () {
            if (this.readyState === 4) {
                console.log(this.responseText)
                console.log(JSON.parse( this.responseText).status===1?'License complete':'Re enter a valid key')// key validation with the server response
            }
            });

            xhr.open("POST", "https://76c6d974-0305-4a40-b499-6b3efee4938f.mock.pstmn.io/license");
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
            xhr.setRequestHeader("Cache-Control", "no-cache");  

            xhr.send(JSON.stringify( data));
        }
        })
        .catch(console.error);


    mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
        preload: path.join(__dirname, 'preload.js')
        }
    })

    mainWindow.loadFile('index.html')

    mainWindow.on('closed', function () { 
        mainWindow = null
    })
    } 
    app.on('ready', createWindow)

удачи! проголосуйте, если это поможет другим легко найти.

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