Javascript 在React中的单击处理程序中访问承诺解析
此用例有三个步骤:Javascript 在React中的单击处理程序中访问承诺解析,javascript,reactjs,promise,async-await,es6-promise,Javascript,Reactjs,Promise,Async Await,Es6 Promise,此用例有三个步骤: 1.调用API检查记录是否存在 2.如果记录存在,则询问用户是否要将其添加到组中 3.如果用户在我们询问他们的显示模式上单击“确定”,则继续另一个网络请求 我正在尝试使用自定义组件中编写的模式确认获取用户输入,如果用户单击“确定”或“取消”,我希望发出网络请求 我无法访问promise resolve函数,即使我将其分配给“onClick”处理程序可以访问的变量 我已经尝试访问用户单击的按钮的onClick处理程序中的promise resolve函数。结果是没有定义 get
1.调用API检查记录是否存在
2.如果记录存在,则询问用户是否要将其添加到组中
3.如果用户在我们询问他们的显示模式上单击“确定”,则继续另一个网络请求 我正在尝试使用自定义组件中编写的模式确认获取用户输入,如果用户单击“确定”或“取消”,我希望发出网络请求 我无法访问promise resolve函数,即使我将其分配给“onClick”处理程序可以访问的变量 我已经尝试访问用户单击的按钮的onClick处理程序中的promise resolve函数。结果是没有定义 getUserResponse作为参数发送给另一个函数,该函数存在于单独的JS文件中,所有网络调用都在该文件中进行。在发现记录作为API调用的结果而存在后,将在那里调用它
让外界去解决;
const getUserResponse=async()=>{
返回等待新承诺((解决、拒绝)=>{
局外人解决=决心;
});
};
const confirmAddRecord=事件=>{
event.preventDefault();
//单击按钮后解决承诺
OutlineResolve();//错误:OutlineResolve不是函数
};
返回(
记录存在您想将其添加到组中吗
添加现有记录!
);
*********************************
在另一个文件(networkCalls.js)中,发送getUserResponse
作为上面总结的文件中调用的方法的参数
试一试{
让userResponse=等待getUserResponse();
log(userResponse);
//收到回复后再做更多的事情
}捕获(错误){
console.log(错误);
}
我创建了一个codeSandbox,以更详细地重新创建问题:
如果我理解正确-您遇到的主要问题是从原始API调用(
检查用户是否存在)获取信息。根据返回的信息,您希望采取另一个操作
请参阅我对您的问题的解决方案(在您的codesandbox
上测试)。下面是一个带有实现()的分支
index.js
如下
import React, { useState } from "react";
import ReactDOM from "react-dom";
import {
ADD_NEW_RECORD,
MAKE_API_CALL_AFTER_RECORD_CHECK
} from "./networkCalls";
import "./styles.css";
function App() {
const [isModalOpen, setIsModelOpen] = useState(false);
const [infoFromCreateRecord, setInfoFromCreateRecord] = useState({});
const createRecord = () => {
ADD_NEW_RECORD(isModalOpen, setIsModelOpen, setInfoFromCreateRecord);
};
const confirmAddRecord = () => {
MAKE_API_CALL_AFTER_RECORD_CHECK(infoFromCreateRecord);
setIsModelOpen(false);
};
const renderModal = () => {
return (
<div>
<p>Record Exists would you like to add them to the group?</p>
<button onClick={confirmAddRecord}>Add Existing record !</button>
</div>
);
};
return (
<div className="App">
<p>Add record by pressing this button</p>
<button onClick={createRecord}>Create record </button>
{isModalOpen ? renderModal() : ""}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
export const ADD_NEW_RECORD = (
isModalOpen,
setIsModalOpen,
setInfoFromCreateRecord
) => {
//checking from an API of record exists
const checkIfRecordExists = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Record Exists");
resolve("Record Exists");
}, 1000);
});
//record exists, ask the user if they want to add them to the group
checkIfRecordExists.then(() => {
setInfoFromCreateRecord({
importantInfo: "record does exits"
});
setIsModalOpen(!isModalOpen);
});
};
export const MAKE_API_CALL_AFTER_RECORD_CHECK = infoFromCreateRecord => {
// do some stuff with the info from the first API call
const doSomethingAfterRecordCheck = new Promise((resolve, reject) => {
setTimeout(() => {
console.log(infoFromCreateRecord);
resolve("User got added to the group!");
}, 1000);
});
doSomethingAfterRecordCheck.then(() => {
console.log("do something after adding the user to the group");
});
};
如果我理解正确-您遇到的主要问题是从原始API调用获取信息(检查用户是否存在
)。根据返回的信息,您希望采取另一个操作
请参阅我对您的问题的解决方案(在您的codesandbox
上测试)。下面是一个带有实现()的分支
index.js
如下
import React, { useState } from "react";
import ReactDOM from "react-dom";
import {
ADD_NEW_RECORD,
MAKE_API_CALL_AFTER_RECORD_CHECK
} from "./networkCalls";
import "./styles.css";
function App() {
const [isModalOpen, setIsModelOpen] = useState(false);
const [infoFromCreateRecord, setInfoFromCreateRecord] = useState({});
const createRecord = () => {
ADD_NEW_RECORD(isModalOpen, setIsModelOpen, setInfoFromCreateRecord);
};
const confirmAddRecord = () => {
MAKE_API_CALL_AFTER_RECORD_CHECK(infoFromCreateRecord);
setIsModelOpen(false);
};
const renderModal = () => {
return (
<div>
<p>Record Exists would you like to add them to the group?</p>
<button onClick={confirmAddRecord}>Add Existing record !</button>
</div>
);
};
return (
<div className="App">
<p>Add record by pressing this button</p>
<button onClick={createRecord}>Create record </button>
{isModalOpen ? renderModal() : ""}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
export const ADD_NEW_RECORD = (
isModalOpen,
setIsModalOpen,
setInfoFromCreateRecord
) => {
//checking from an API of record exists
const checkIfRecordExists = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Record Exists");
resolve("Record Exists");
}, 1000);
});
//record exists, ask the user if they want to add them to the group
checkIfRecordExists.then(() => {
setInfoFromCreateRecord({
importantInfo: "record does exits"
});
setIsModalOpen(!isModalOpen);
});
};
export const MAKE_API_CALL_AFTER_RECORD_CHECK = infoFromCreateRecord => {
// do some stuff with the info from the first API call
const doSomethingAfterRecordCheck = new Promise((resolve, reject) => {
setTimeout(() => {
console.log(infoFromCreateRecord);
resolve("User got added to the group!");
}, 1000);
});
doSomethingAfterRecordCheck.then(() => {
console.log("do something after adding the user to the group");
});
};
我觉得network.js应该只返回承诺,这些承诺应该在主组件中得到解决
import React, { useState } from "react";
import ReactDOM from "react-dom";
import { ADD_NEW_RECORD } from "./networkCalls";
import "./styles.css";
function App() {
const [isModalOpen, setIsModelOpen] = useState(false);
let createRecordPromsie = null;
const createRecord = () => {
createRecordPromsie = ADD_NEW_RECORD();
createRecordPromsie.then(data => {
setIsModelOpen(true);
});
};
const getUserResponse = new Promise((resolve, reject) => {
resolve();
});
const confirmAddRecord = event => {
event.preventDefault();
//resolve the promise after the button click
console.log("Added Existing record");
getUserResponse.then(data => {
setIsModelOpen(false);
}); //this turns out to be undefined
};
const renderModal = () => {
return (
<div>
<p>Record Exists would you like to add them to the group?</p>
<button onClick={confirmAddRecord}>Add Existing record !</button>
</div>
);
};
return (
<div className="App">
<p>Add record by pressing this button</p>
<button onClick={createRecord}>Create record </button>
{isModalOpen ? renderModal() : ""}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
我觉得network.js应该只返回承诺,这些承诺应该在主组件中得到解决
import React, { useState } from "react";
import ReactDOM from "react-dom";
import { ADD_NEW_RECORD } from "./networkCalls";
import "./styles.css";
function App() {
const [isModalOpen, setIsModelOpen] = useState(false);
let createRecordPromsie = null;
const createRecord = () => {
createRecordPromsie = ADD_NEW_RECORD();
createRecordPromsie.then(data => {
setIsModelOpen(true);
});
};
const getUserResponse = new Promise((resolve, reject) => {
resolve();
});
const confirmAddRecord = event => {
event.preventDefault();
//resolve the promise after the button click
console.log("Added Existing record");
getUserResponse.then(data => {
setIsModelOpen(false);
}); //this turns out to be undefined
};
const renderModal = () => {
return (
<div>
<p>Record Exists would you like to add them to the group?</p>
<button onClick={confirmAddRecord}>Add Existing record !</button>
</div>
);
};
return (
<div className="App">
<p>Add record by pressing this button</p>
<button onClick={createRecord}>Create record </button>
{isModalOpen ? renderModal() : ""}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);